1

我要丢弃 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'
4

4 回答 4

2

DefaultIfEmpty在实体框架中仅适用于导航属性。否则,您应该使用GroupJoin,它在综合语法中是由join...实现的into。有关更多详细信息,请参阅这篇出色的帖子

所以您的查询可能是(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属性应该是Selecton endVal.Dtsl,产生一个Dtsl值的集合。集合可以为空(零个元素),表示外连接。

或者,如果有导航属性Artwork.EndValidities

from art in db.Artworks
from endVal in art.EndValidities.DefaultIfEmpty() 
...
于 2012-09-19T22:29:06.950 回答
1

我的 Demo,在 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();
于 2013-06-27T05:45:13.877 回答
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
     };
于 2012-09-19T13:27:13.310 回答
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();
于 2013-08-08T13:44:42.440 回答