带有LINQ和联接的ASP.NET GridView数据源

时间:2011-05-18 09:24:56

标签: c# asp.net linq gridview datasource

我正在尝试使用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中的这些数字与我的外键表相结合。

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

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

EDIT3: 我已将我的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();

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

http://i.stack.imgur.com/eSFQX.png

2 个答案:

答案 0 :(得分:1)

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

更新的 从你的db-structure的解释我可以看到问题是你正在连接三个带有内连接的表,并且你正在加入的一些字段是null。这样你就永远不会得到任何结果。你需要去外连接。 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>

答案 1 :(得分: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]

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