2011-03-30 45 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