Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有LINQ和联接的ASP.NET GridView数据源_C#_Asp.net_Linq_Gridview_Datasource - Fatal编程技术网

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

C# 带有LINQ和联接的ASP.NET GridView数据源,c#,asp.net,linq,gridview,datasource,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.tid

我正在尝试使用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;
}
我的绑定发生在页面加载时:

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
);
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();
List templast=(来自kdc.tidsregistring中的t
在t上的kdc.projekts中加入p。projektid等于p.id进入p\t
在t.kundeid等于k.id的kdc.kundes中加入k到k_t中
在t上的kdcøvriges中加入o。øvrigeid等于o.id进入oÈt
来自k_t.DefaultIfEmpty()中的k
来自p_t.DefaultIfEmpty()中的p
来自o_t.DefaultIfEmpty()中的o
其中t.medarbejderid==CurrentMedarbejder.id
选择t.ToList();
但它仍然不选择加入的内容…


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

更新 从对db结构的解释中,我可以看出问题在于,您正在连接三个具有内部连接的表,并且您正在连接的一些字段为null。那样你永远不会有任何结果。您需要转到外部联接。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>

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

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

假设您不在service.cs->中处理datacontext,否则您需要向该绑定添加dataloadoptions以确保项目数据被急切加载我也尝试了此方法,并且“当我输入时,代码块不受支持。我已经阅读了您提到的示例链接,并编辑了我的问题。绑定可能需要在templatefield中,我已经更新了我的答案。此外,您可能还必须处理空值。当我运行此命令时:
select t.*from tidsregistering t internal join projekt p on t.projektid=p.id internal join kunde k on t.kundeid=k.id internal joinøvrige o on t.vrigeid=o.id其中t.medarbejderid=1
我得到一个空表OK,因此,现在运行:从TIDSregistering t internal join projekt p on t.projektid=p.id internal join kunde k on t.kundeid=k.id中选择t.*t,其中t.medarbejederid=1在您发布的示例数据中,kundeid为空=>这将永远不会返回内部联接中的任何数据…好的,来解释我的数据库设置:如果类型是“projekt”,“kunde”和“øvrige”字段将为空。。。反之亦然,如果类型为“kunde”,则其他两个字段为null…在这种情况下,您需要进行外部联接,而不是内部联接。。。只有当等式两边都有数据时,内部联接才会返回数据。
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]