2012-09-19 144 views
1

我要去垃圾實體框架5!我花了兩天的時間從網上找到解決方案,但一無所獲!左加入實體框架

我試過一個簡單的左表藝術品和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' 

回答

2

實體框架中僅DefaultIfEmpty適用於導航屬性。否則,您應該使用GroupJoin,它的全面語法是由join ... into實現的。有關更多詳細信息,請參閱this excellent post

所以,你的查詢可以是(羣組加入):

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對象,每個對象art對象endVal的集合。因此Dtsl屬性應該是endVal.Dtsl上的Select,生成值爲Dtsl的集合。該集合可以是空的(零個元素),它表示外部聯接。

或者,如果有導航屬性Artwork.EndValidities

from art in db.Artworks 
from endVal in art.EndValidities.DefaultIfEmpty() 
... 
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 
    }; 
+0

mmm代碼正如上面生成,我的linq是: 來自artwor在db.Artworks KS 加入EV在artworks.ID_Dtsl db.EndValidities在endVal.DefaultIfEmpty() 其中artworks.ID_Cdgs == IDFondazione 選擇新SchedaOpera(等於ev.IDdtsl 到endVal 從EV)我缺少的東西? – velteyn

+0

@velteyn我編輯過,也許試試最後的代碼。如果您在藝術品中擁有「EndValidity」屬性,這將會更容易......您不能嗎? –

+0

嗯最後一個代碼沒有編譯:( 嗯,如果我把EndValidity屬性改成藝術品將如何改變? – velteyn

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