如何在Linq中执行子查询

时间:2011-03-30 09:45:20

标签: linq nhibernate fluent-nhibernate

我有课程FooBar

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)。

2 个答案:

答案 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,您还可以将查询表示为加入。

如果您在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(),
}

答案 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")});