我有课程Foo
和Bar
:
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 :(得分: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(),
}
如果每个BAR
只有一个FOO
,您还可以将查询表示为加入。
如果您在FOO
和BAR
之间存在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(),
}
答案 1 :(得分:0)
我假设您的IEnumerable实际上是一个名为“Bars”的属性:
var foos = dbContext.FOOS.Where(f => f.ID == 1);
var foobar = foos.Select(f => new {f, f.Bars.FirstOrDefault(b => b.TYPE == "Irish")});