2009-07-07 6 views
2

J'ai une question:valeur Obtenir la base de données relationed

J'ai deux tables de MSSQL, les éléments et les États, qui sont reliés entre eux par un stateid:

STATES     ITEMS 
------------- --------------------------- 
| id | name | | id | name | ... | stateid 
    V         ^
    |_____________________________________| 

Alors Items.StateID est lié à l'État .ID. Dans ma situation actuelle, j'ai un GridView qui est databound à un LinqDataSource, qui fait référence à la table Items. Le GridView a deux colonnes, l'un est Name et l'autre est StateID. Je veux pouvoir extraire le nom de l'état associé à l'état StateID de la table d'état pour qu'il s'affiche à la place de l'état StateID.

Merci d'avance!

EDIT

Voici la grille/source de données:

<asp:LinqDataSource ID="ItemViewDataSource" runat="server" ContextTypeName="GSFyi.GSFyiDataClassesDataContext" EnableDelete="true" TableName="FYI_Items" /> 

<h2 class="gridTitle">All Items</h2> 
<telerik:RadGrid ID="ItemViewRadGrid" runat="server" AutoGenerateColumns="False" DataSourceID="ItemViewDataSource" GridLines="None" AllowAutomaticDeletes="True" EnableEmbeddedSkins="False" OnItemDataBound="itemsGrid_ItemDataBound"> 
<HeaderContextMenu> 
    <CollapseAnimation Type="OutQuint" Duration="200"></CollapseAnimation> 
</HeaderContextMenu> 
<MasterTableView DataKeyNames="id" DataSourceID="ItemViewDataSource" CommandItemDisplay="None" CssClass="listItems" Width="98%"> 
    <RowIndicatorColumn> 
     <HeaderStyle Width="20px" /> 
    </RowIndicatorColumn> 
    <ExpandCollapseColumn> 
     <HeaderStyle Width="20px" /> 
    </ExpandCollapseColumn> 
    <Columns> 
     <telerik:GridTemplateColumn ItemStyle-CssClass="gridActions edit" UniqueName="Edit"> 
      <ItemTemplate> 
       <asp:HyperLink ID="edit" runat="server" Text="Edit"></asp:HyperLink> 
      </ItemTemplate> 
<ItemStyle CssClass="gridActions edit"></ItemStyle> 
     </telerik:GridTemplateColumn> 
     <telerik:GridButtonColumn ConfirmText="Are you sure you want to delete this item?" ConfirmDialogType="RadWindow" ButtonType="LinkButton" ItemStyle-CssClass="gridActions delete" CommandName="Delete" > 
<ItemStyle CssClass="gridActions delete"></ItemStyle> 
     </telerik:GridButtonColumn> 
     <telerik:GridBoundColumn DataField="name" HeaderText="Item Name" SortExpression="name" 
      UniqueName="name"> 
     </telerik:GridBoundColumn> 
        <telerik:GridTemplateColumn HeaderText="State" UniqueName="state"> 
         <ItemTemplate> 
          <asp:Label ID="stateLbl" runat="server" Text='<%# Eval("stateid") %>' /> 
         </ItemTemplate> 
        </telerik:GridTemplateColumn> 
    </Columns> 
</telerik:RadGrid> 

Et le code-behind actuel:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using Telerik.Cms.Web.UI; 
using Telerik.Web.UI; 

public partial class Custom_Modules_GSFyi_Backend_Views_ItemsListView : ViewModeUserControl<ItemsView> 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     addNewItem.NavigateUrl = CreateHostViewCommand("ItemsInsertView",null,null); 
    } 
    protected void itemsGrid_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e) 
    { 
     if (e.Item.ItemType == GridItemType.Item || e.Item.ItemType == GridItemType.AlternatingItem) 
     { 
      var item = (GSFyi.FYI_Item)e.Item.DataItem; 
      HyperLink edit = (HyperLink)e.Item.FindControl("edit"); 
      edit.NavigateUrl = CreateHostViewCommand("ItemsEditView", item.id.ToString(), null); 

     } 
    } 
} 

cette aide à tous?

Répondre

4

En supposant que vous avez défini le lien dans vos classes de données LinqToSql et le contrôle LinqDataSource être pointés vers l'entité Les éléments que vous devriez être en mesure d'utiliser directement la syntaxe de liaison de données suivante dans votre balisage GridView :

<asp:GridView ID="ItemsGridView" runat="server" DataKeyNames="id" DataSourceID="ItemsLinqDataSource"> 
    <Columns> 
     <asp:TemplateField> 
        <ItemTemplate> 
          <%# Eval("states.name") %> 
        </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

<asp:LinqDataSource ID="ItemsLinqDataSource" runat="server" ContextTypeName="DataClassesDataContext" TableName="items"></asp:LinqDataSource> 
+0

Pouvez-vous élaborer sur la première partie de votre message? Je ne suis pas sûr de ce que vous voulez dire en ayant mon point LinqDataSource à l'entité de mon objet. Merci! – Anders

+0

Je veux simplement dire que votre LINQDataSource pointe vers la table des éléments. J'ai mis à jour ma réponse pour montrer un exemple. Le code que vous avez fourni semble avoir été configuré correctement. – joshb

+0

Ok, merci. Je l'ai maintenant :) – Anders

1

Essayez quelque chose comme ceci:

var query = from s in States 
      join i in Items on s.ID equals i.StateID 
      select i.Name; 

Le fournisseur LINQ to SQL prendra cette requête et le convertir à une requête SQL qui ressemble à quelque chose comme ceci:

select i.Name 
from Items i 
    inner join States s on i.StateID = s.ID; 

suggéré lecture: SQL INNER JOIN Keyword

+0

OK, je vais devoir faire cela dans le page_load alors je peux spécifier la requête exacte plutôt que d'utiliser le LinqDataSource correct? – Anders

+0

Je ne comprends pas - pouvez-vous poster plus de code afin que je puisse mieux vous aider? –

+0

Oui, vous pouvez modifier la requête LinqDataSource. – iburlakov

1

Essayez:

var query = from i in Items 
      join s in States on s.id equals i.stateid 
      select s.name, i.name 
Questions connexes