左加入实体框架

时间:2012-09-19 13:22:38

标签: linq entity-framework c#-4.0

我要删除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 个答案:

答案 0 :(得分:2)

实体框架中的

DefaultIfEmpty仅适用于导航属性。否则,您应该使用GroupJoinjoin 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();
相关问题