【问题标题】:ASP.NET GridView DataSource with LINQ and Joins带有 LINQ 和联接的 ASP.NET GridView 数据源
【发布时间】:2011-08-27 21:37:51
【问题描述】:

我正在尝试使用 LINQ 在我的 GridView 中绑定数据。

在我的 Service.cs 文件中,我有一个获取特定登录用户条目的方法:

public List<tidsregistrering> ShowTidregistreringer()
{
    var CurrentMedarbejder = FindUser(HttpContext.Current.Session["email"].ToString());

    var tempList = (from t in kdc.tidsregistrerings
                    join p in kdc.projekts on t.projektid equals p.id
                    join k in kdc.kundes on t.kundeid equals k.id
                    join o in kdc.øvriges on t.øvrigeid equals o.id
                    where t.medarbejderid == CurrentMedarbejder.id
                    select t).ToList();    

    return tempList;
}

kdc 是我的 DataContext。我尝试将不同的表连接在一起,但我的 GridView 中没有显示任何数据。如果我省略连接,我会得到数据......在我的其他表中,我有一个名为navn(名称)的列。我希望在我的 GridView 中使用该名称 printet 而不是外键引用...

我的 GridView:

<asp:GridView ID="GridView1" runat="server">
    <Columns>
        <asp:BoundField DataField="tidsforbrug" HeaderText="Tidsforbrug" />
        <asp:BoundField DataField="dato" HeaderText="Dato" />
        <asp:BoundField DataField="<%# Bind("projekt.id") %>" HeaderText="Projekt" />
        <asp:BoundField DataField="<%# Bind("kunde.id") %>" HeaderText="Kunde" />
        <asp:BoundField DataField="<%# Bind("øvrige.id") %>" HeaderText="Øvrigt" />
        <asp:BoundField DataField="done" HeaderText="Done" />
    </Columns>
</asp:GridView

我的绑定发生在 Page_load:

GridView1.DataSource = service.ShowTidregistreringer();
GridView1.DataBind();

我该怎么做?

编辑: 到目前为止,这是我的清单...而且我希望将 projektid、kundeid 和 øvrigeid 中的这些数字与我的外键表连接起来。

*编辑2:** 为了更好地衡量,这是我的数据库表的创建方式:

CREATE TABLE chef(
    id int identity primary key,
    email varchar(100) unique not null,
    password char(100) not null,
    navn varchar(100) not null
);

CREATE TABLE medarbejder(
    id int identity primary key,
    email varchar(100) unique not null,
    password char(100) not null,
    navn varchar(100) not null,
    chefid int foreign key references chef(id)
);

CREATE TABLE projekt(
    id int identity primary key,
    navn varchar(50) not null,
    beskrivelse varchar(255) not null
);

CREATE TABLE kunde(
    id int identity primary key,
    navn varchar(50) not null,
    beskrivelse varchar(255) not null
);

CREATE TABLE øvrige(
    id int identity primary key,
    navn varchar(50) not null,
);

CREATE TABLE tidsregistrering(
    id int identity primary key,
    tidsforbrug float,
    dato datetime,
    projektid int foreign key references projekt(id),
    kundeid int foreign key references kunde(id),
    øvrigeid int foreign key references øvrige(id),
    medarbejderid int foreign key references  medarbejder(id) not null,
    done bit
);

编辑3: 我已将我的 LINQ 查询重新制作为:

List<tidsregistrering> tempList = (from t in kdc.tidsregistrerings
                                   join p in kdc.projekts on t.projektid equals p.id into p_t
                                   join k in kdc.kundes on t.kundeid equals k.id into k_t
                                   join o in kdc.øvriges on t.øvrigeid equals o.id into o_t
                                   from k in k_t.DefaultIfEmpty()
                                   from p in p_t.DefaultIfEmpty()
                                   from o in o_t.DefaultIfEmpty()
                                   where t.medarbejderid == CurrentMedarbejder.id
                                   select t).ToList();

但它仍然没有选择加入的内容...

【问题讨论】:

    标签: c# asp.net linq gridview datasource


    【解决方案1】:

    在 SQL Server Management Studio 中运行此查询

    select t.* from tidsregistrerings t 
    inner join projekts p on t.projektid = p.id
    inner join kundes k on t.kundeid    = k.id 
    inner join øvriges o on t.øvrigeid = o.id 
    where t.medarbejderid = [whatever CurrentMedarbejder id is]
    

    然后一次注释掉一个连接,直到返回结果。这将向您显示哪个表阻止您的数据被返回。

    【讨论】:

    • 当我运行这个时:select t.* from tidsregistrering t inner join projekt p on t.projektid = p.id inner join kunde k on t.kundeid = k.id inner join øvrige o on t.øvrigeid = o.id where t.medarbejderid = 1 我得到一个空表
    • 好的,现在运行:select t.* from tidsregistrering t inner join projekt p on t.projektid = p.id inner join kunde k on t.kundeid = k.id where t.medarbejderid = 1
    • 在您发布的示例数据中 kundeid 为空 => 这将永远不会在您的内部连接中返回任何数据...
    • 好吧,解释一下我的数据库设置:如果类型是“projekt”,那么“kunde”和“øvrige”字段将为空……反之亦然,如果类型是“kunde”其他两个字段为空...
    • 在这种情况下,您需要进行外连接而不是内连接...只有等式两边都有数据时,内连接才会返回数据。
    【解决方案2】:

    那么,您的数据库中的数据一定有问题。或者更确切地说,由于所有连接,您没有获得任何数据。

    更新 从您的数据库结构的解释中,我可以看到问题是您正在加入三个具有内部连接的表,并且您正在加入的一些字段为空。这样你永远不会得到任何结果。你需要去外部连接。 Linq 没有外连接语句,但可以做到。看看这里: http://smehrozalam.wordpress.com/2009/06/10/c-left-outer-joins-with-linq/

    顺便说一句,如果你的数据库中有正确的外键,你可以简单地得到:

    tempList = (from t in kdc.tidsregistrerings
    where t.medarbejderid == CurrentMedarbejder.id 
    select t).ToList();  
    

    更新 2 你可以这样绑定:

    <asp:TemplateField HeaderText="navn" SortExpression="projekts.navn">
                            <ItemTemplate>
                                <asp:literal ID="Label2" runat="server" Text='<%# Eval("projekts.navn") %>'></asp:literal>
                            </ItemTemplate>
                        </asp:TemplateField>
    

    【讨论】:

    • 假设你没有在 service.cs 中处理你的 datacontext -> 否则你需要添加 dataloadoptions 来确保项目数据被预先加载
    • 我也试过这个方法,我得到“当我在 GridView 的标签中输入&lt;asp:BoundField DataField="&lt;%# Bind("projekts.navn") %&gt; 时不支持代码块。
    • 我已阅读您提到的示例链接,并编辑了我的问题。
    • 绑定可能需要在模板字段中,我已经更新了我的答案。此外,您可能必须处理空值。
    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多