2017-06-02 38 views
0

我有兩個表,Table1和Table2。 Table1與Table2有一對多的關係。
表1有ListId,LISTNAME
表2有名字,姓氏,電話,ListId,自定義字段,自定義字段
C#Lambda加入檢索第一行值

我想要檢索的所有的表1行,但只檢索表2的自定義字段值僅第一行。

我現在的查詢下面是從Table2中檢索我不需要的所有行。

var result = _db.Lists 
       .Join(_db.ListUsers, c => c.ListID, d => d.ListID, (c, d) => new { c, d }); 

我的最終結果集需要這個樣子
Table1.ListId,Table1.ListName,Table2.CustomField2
1,第一個列表, 「ABC」
2,第二個列表, 「高清」

+0

你需要執行左連接。 – Santhosh

+0

我想我正在努力與左連接...我可以很容易地在tsql中使用CTE和左連接實現這一點,但在這裏沒有太多的成功。 – Nizar

回答

1

這應該做的伎倆,只得到右邊表格中的第一條記錄:

from i in _db.Lists 
let p = _db.ListUsers.Where(p2 => i.ListID == p2.ListID).FirstOrDefault() 
select new 
{ 
    ListID = i.ListID, 
    ListName = i.ListName, 
    CustomField2 = p.CustomField2 
} 

隨着lambda表達式,這將是:

_db.Lists 
.Select (
    i => 
    new 
    { 
     i = i, 
     p = _db.ListUsers 
      .Where (p2 => i.ListID == p2.ListID)) 
      .Take(1) 
      .FirstOrDefault() 
    }) 
    .Select (
    results => 
    new 
    { 
     ListID= results.i.ListID, 
     ListName = results.i.ListName, 
     CustomField2 = results.p.CustomField2 
    } 

+0

非常感謝!這肯定導致我尋找的解決方案。謝謝大家如此迅速的貢獻。 – Nizar

+0

很好幫助:) @Nizar –

0

從我讀到的結果你想要實現的是檢索結果列表包含來自表1的所有列&來自表2(非行)的1列

有幾種方法可以做到這一點。我會使用創建一個DTO類來檢索我的結果。在選擇中,您需要專門列出選擇結果中的項目。 例如, 創建DTO類

public class DTOListResult 
{ 
public string XXX {get; set;} 
... 
} 

然後在你的結果,你可以這樣寫。

var result = (from a in _db.Lists select new DTOListResult { XXX = _db.table2.ID, 
xxx = a.ID, 
XXX = a.XX}); 
+0

這是最終的目標,但我還沒有。由於1對多的關係,我得到了Table2中的所有行。 – Nizar