动态linq-to-nhibernate查询问题

动态linq-to-nhibernate查询问题,linq,nhibernate,subquery,linq-to-nhibernate,dynamicquery,Linq,Nhibernate,Subquery,Linq To Nhibernate,Dynamicquery,假设我有如下类Foo和Bar: public class Foo { public string F1 {set; get;} public string F2 {set; get;} public Bar ContainerBar {set; get;} } public class Bar { public string B1 {set; get;} public string B2 {set; get;} public List<Foo> Foos {set; get;}

假设我有如下类
Foo
Bar

public class Foo
{
public string F1 {set; get;}
public string F2 {set; get;}

public Bar ContainerBar {set; get;}
}

public class Bar
{
public string B1 {set; get;}
public string B2 {set; get;}

public List<Foo> Foos {set; get;}
}
我知道第二个语句中的
foo
实际上是一个
Bar
,因为查询选择
ContainerBar

问题是知道如何在不更改原始查询的情况下向查询添加动态where子句?最终目标是在session.linq()中使用linq对nhibernate进行子查询。

var query=from foo
var query = from foo in session.Linq<Foo>()
                 select foo.ContainerBar;

query = query.Where(foo => foo.F1 == "abcdef");
选择foo.ContainerBar; query=query.Where(foo=>foo.F1==“abcdef”);
您的“查询”对象现在是ContainerBar的IQueryAble 因此,当您执行Where(foo=>foo.F1==“abcdef”)时,它是在IQueryable上完成的,因此没有F1属性

你应该做:

var bars = from foo in session.Linq<Foo>()
            where foo.F1 == "abcdef"
            select foo.ContainerBar;
var bar=来自session.Linq()中的foo
其中foo.F1==“abcdef”
选择foo.ContainerBar;
或:

var q=session.Linq();
//如果有条件
q=q.Where(foo=>foo.F1==“abcdef”);
变量条=q.Select(foo=>foo.ContainerBar);

您正在使用NHibernate 3.0吗?第一个查询对我不起作用(NHibernate 2.1.2.4000,无效转换)。然而,看起来你正试图得到所有有食物的酒吧,可以这样做

IQueryable<Bar> bars = Session
    .Linq<Bar>()
    .Where(bar => bar.Foos.Any());
var result = bars
    .Where(bar => bar.Foos.Any(foo => foo.F1 == "b"));

但是where子句必须在运行时添加。不,我使用的是NHibernate2.1.2
IQueryable<Bar> bars = Session
    .Linq<Bar>()
    .Where(bar => bar.Foos.Any());
var result = bars
    .Where(bar => bar.Foos.Any(foo => foo.F1 == "b"));