2011-03-30 27 views
0

我有類FooBar如何做一個子查詢中的LINQ

public class Foo 
{ 
    public int Id {get;set;} 
    public IEnumerable<Bar> Bars {get;private set;} 
} 

public class Bar 
{ 
    public int Id {get;set;} 
    public string Type {get;set;} 
    public string Description {get;set;} 
} 

這兩個類映射到數據庫中的表在可預見的「Bar有外鍵Foo」的一種方式。 (如果需要,我可以提供FluentNHibernate映射)。

我想編寫一個LINQ查詢,做的這相當於:

SELECT FOOS.*, (SELECT Description FROM BARS WHERE BAR.FOOID = FOO.ID AND BAR.TYPE = 'Irish') 
FROM FOOS 
WHERE FOO.ID = 1 

我將如何做到這一點?

是的,我知道如果Foo有多個愛爾蘭Bar(儘管我可以使用TOP 1類型的語法來保護它),查詢將會中斷。是的,我的意思是使用子查詢而不是聯接。

編輯:

var foosWithIrishBarDescription = FooRepository.All.Where(x => x.Id == 1).Select(x=> new {FooId = x.Id, IrishBarDescription = x.Bars.Where(y => y.Type == "Irish").Select(y => y.Description)}); 

但我得到的錯誤「方法‘選擇:

這就是我想到目前爲止’未實現。」這不能在Linq中實現NHibernate嗎? (我使用2.1)。

回答

0

我假設你的IEnumerable的其實是一個叫「酒吧」的屬性:

var foos = dbContext.FOOS.Where(f => f.ID == 1); 
var foobar = foos.Select(f => new {f, f.Bars.FirstOrDefault(b => b.TYPE == "Irish")}); 
+0

這會導致兩個SELECT到數據庫不會嗎? – David 2011-03-30 10:01:27

+0

它不會。 (由於延期執行)。 – 2011-03-30 10:23:17

+0

謝謝你指出我沒有命名集合!我現在糾正了。我會檢查你現在做的方式。 – David 2011-03-30 10:39:33

0
from f in dbContext.FOOSs 
where f.ID = 1 
select new 
{ 
    FOOS = f, 
    Description = (from b in dbContext.BARSs 
        where b.FOOID == f.ID && b.TYPE == "Irish" 
        select b.Description).FirstOrDefault(), 
} 

如果您只能爲每臺FOO一個BAR還可以表達查詢的加盟。

如果你有FOOBAR之間的FK關係,你可以使用這些信息來獲得一個更可讀的查詢

from f in dbContext.FOOSs 
where f.ID = 1 
select new 
{ 
    FOOS = f, 
    Description = (from b in f.BARSs 
        where b.TYPE == "Irish" 
        select b.Description).FirstOrDefault(), 
} 
+0

Foo和Bar之間存在關聯,因此我的Linq查詢需要使用關聯。例如,Description = from f.Bars .......) – David 2011-03-30 10:09:41