Получить значение из реляционной базы данных

2

У меня вопрос:

У меня есть две таблицы, элементы и состояния MSSQL, которые связаны между собой через stateid:

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

Итак, Items.StateID связан с State.ID. В моей текущей ситуации у меня есть GridView, который привязывается к LinqDataSource, который ссылается на таблицу Items. GridView имеет два столбца, один - Name, а другой - StateID. Я хочу, чтобы вытащить имя состояния, связанного с идентификатором состояния, из таблицы состояний, чтобы оно отображалось вместо идентификатора состояния.

Спасибо заранее!

ИЗМЕНИТЬ

Вот сетка/источник данных:

<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>

И текущий код:

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);

        }
    }
}

Помогает ли это вообще?

Теги:
database
linq-to-sql

3 ответа

4
Лучший ответ

Предполагая, что вы определили взаимосвязь в своих классах данных LINQtoSQL, а элемент управления LINQDataSource указывает на объект Items, вы должны иметь возможность использовать следующий синтаксис привязки данных непосредственно в вашей разметке 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
    Можете ли вы уточнить первую часть вашего поста? Я не уверен, что вы имеете в виду, имея мою точку LinqDataSource на объекте моего элемента. Спасибо!
  • 0
    Я просто имею в виду, что ваш LINQDataSource указывает на таблицу элементов. Я обновил свой ответ, чтобы показать пример. Код, который вы предоставили, выглядит так, как будто вы правильно его настроили.
Показать ещё 1 комментарий
1

Попробуйте:

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

Попробуйте что-то вроде этого:

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

Поставщик LINQ to SQL примет этот запрос и преобразует его в SQL-запрос, который будет выглядеть примерно так:

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

Рекомендуемое чтение: SQL INNER JOIN Ключевое слово

  • 0
    Хорошо, тогда я должен сделать это в page_load, чтобы я мог указать точный запрос, а не использовать правильный LinqDataSource?
  • 0
    Я не понимаю - вы можете опубликовать больше кода, чтобы я мог лучше помочь?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню