我要删除Entity Framework 5!我花了两天时间从网上找到解决方案,但一无所获!
我尝试使用表格Artworks和EndValidities进行简单的左连接,输入IDFondazione为2620
var query = from art in db.Artworks
join endVal in db.EndValidities.DefaultIfEmpty()
on art.ID_Dtsl equals endVal.IDdtsl
where art.ID_Cdgs == IDFondazione
select new SchedaOpera()
{
Cdscheda = art.Cdscheda,
Confirmed = art.FGconfermata,
DSimmagine = art.DSimmgine,
Dtsf = art.Dtsf,
Dtsi = art.Dtsi,
Dtsl = endVal != null ? endVal.Dtsl : "",
Iscr = art.Iscr,
Misa = art.Misa,
Ldcn = art.Ldcn,
Ldcs = art.Ldcs,
Misd = art.Misd,
Misl = art.Misl,
Misn = art.Misn,
Misp = art.Misp,
Miss = art.Miss,
Pvcc = art.Pvcc,
Pvcp = art.Pvcp,
Sgtt = art.Sgtt
};
奇妙的实体框架继续产生
SELECT [Extent1].[ID_Dtsl] AS [ID_Dtsl], [Extent1].[CDscheda] AS [CDscheda],
[Extent1].[FGconfermata] AS [FGconfermata],
[Extent1].[DSimmagine] AS [DSimmagine],
[Extent1].[DS_DTSF] AS [DS_DTSF],
[Extent1].[DS_DTSI] AS [DS_DTSI],
CASE WHEN (cast(1 as bit) <> cast(0 as bit)) THEN [Extent2].[DSdtsl] ELSE N'_' END AS [C1],
[Extent1].[DS_ISCR] AS [DS_ISCR],
[Extent1].[NR_MISA] AS [NR_MISA],
[Extent1].[DS_LDCN] AS [DS_LDCN],
[Extent1].[DS_LDCS] AS [DS_LDCS],
[Extent1].[NR_MISD] AS [NR_MISD],
[Extent1].[NR_MISL] AS [NR_MISL],
[Extent1].[NR_MISN] AS [NR_MISN],
[Extent1].[NR_MISP] AS [NR_MISP],
[Extent1].[NR_MISS] AS [NR_MISS],
[Extent1].[FGpubblicata] AS [FGpubblicata],
[Extent1].[DS_PVCC] AS [DS_PVCC],
[Extent1].[DS_PVCP] AS [DS_PVCP],
[Extent1].[DS_SGTT] AS [DS_SGTT]
FROM [dbo].[TPD_OPERE] AS [Extent1]
INNER JOIN [dbo].[TSA_DTSL] AS [Extent2] ON [Extent1].[ID_Dtsl] = [Extent2].[IDdtsl]
WHERE [Extent1].[CD_CDGS] = '2620'
答案 0 :(得分:2)
DefaultIfEmpty
仅适用于导航属性。否则,您应该使用GroupJoin
,join
into
可以使用综合语法。有关详细信息,请参阅this excellent post。
所以你的查询可能是(GroupJoin):
from art in db.Artworks
join endVal in db.EndValidities on art.ID_Dtsl equals endVal.IDdtsl
into g // can be any name
where art.ID_Cdgs == IDFondazione
...
不同之处在于语句选择art
个对象和每个endVal
对象的art
个对象的集合。因此,Dtsl
属性应为Select
上的endVal.Dtsl
,从而生成Dtsl
个值的集合。该集合可以为空(零元素),表示外部联接。
或者,如果有导航属性Artwork.EndValidities
:
from art in db.Artworks
from endVal in art.EndValidities.DefaultIfEmpty()
...
答案 1 :(得分:1)
我的演示,在linqpad中测试,你可以将外部连接两个表保留如下:
var resultAcctInfo = (
from p in Focus_Person
where String.Compare(p.Login, "yourname", true) == 0 && (p.AcctStatusID == 1 || p.AcctStatusID == 2)
join an in Focus_SecurityAnswer on p.PersonID equals an.PersonID into G
//from g in G //You can uncommented this line to check the difference.
join q in Focus_SecurityQuestion on G.FirstOrDefault().QuestionID equals q.QuestionID into Q //left join question table
//from q in Q
select new
{
Person = p,
Answer = G.FirstOrDefault(),
//Question = q,
});
resultAcctInfo.Dump();
答案 2 :(得分:0)
from art in db.Artworks
join endValidities in db.EndValidities
on art.ID_Dtsl equals endValidities .IDdtsl into ev
where art.ID_Cdgs == IDFondazione
from endVal in ev.DefaultIfEmpty()
select new SchedaOpera()
{
Cdscheda = art.Cdscheda,
Confirmed = art.FGconfermata,
DSimmagine = art.DSimmgine,
Dtsf = art.Dtsf,
Dtsi = art.Dtsi,
Dtsl = endVal.Dtsl ?? string.Empty,
Iscr = art.Iscr,
Misa = art.Misa,
Ldcn = art.Ldcn,
Ldcs = art.Ldcs,
Misd = art.Misd,
Misl = art.Misl,
Misn = art.Misn,
Misp = art.Misp,
Miss = art.Miss,
Pvcc = art.Pvcc,
Pvcp = art.Pvcp,
Sgtt = art.Sgtt
};
答案 3 :(得分:0)
我有这个工作代码: -
var res = from et in db.entity_test join en in db.entity_new on et.id equals en.id into ps from en in ps.DefaultIfEmpty() select new {Name = et.name,Email=en.email };
GridView1.DataSource = res;
GridView1.DataBind();