1

假设我有课程FooBar如下所示:

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;}
}

以下 linq 查询有错误说不foo包含名为F1.

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

query = query.Where(foo => foo.F1 == "abcdef");

我知道foo第二条语句确实是Bar因为查询选择ContainerBar

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

4

2 回答 2

2
var query = from foo in session.Linq<Foo>()
                 select 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 q = session.Linq<Foo>();

// if some condition
q = q.Where( foo => foo.F1 == "abcdef" );

var bars = q.Select( foo => foo.ContainerBar );
于 2010-11-09T21:10:32.457 回答
0

您使用的是 NHibernate 3.0 吗?第一个查询对我不起作用(NHibernate 2.1.2.4000,无效转换)。但是,看起来您正在尝试获取所有具有 Foos 的酒吧,可以这样完成...

IQueryable<Bar> bars = Session
    .Linq<Bar>()
    .Where(bar => bar.Foos.Any());

现在您有了条形图,在您以后的代码中,您可以像这样检查 F1 ......

var result = bars
    .Where(bar => bar.Foos.Any(foo => foo.F1 == "b"));
于 2010-11-11T06:17:00.013 回答