动态linq-to-nhibernate查询问题

时间:2010-11-09 20:13:34

标签: linq nhibernate subquery linq-to-nhibernate dynamicquery

假设我有以下课程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

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

2 个答案:

答案 0 :(得分:3)

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

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

您的“查询”对象现在是ContainerBar的IQueryAble 所以当你做Where(foo =&gt; 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 );

答案 1 :(得分:0)

您使用的是NHibernate 3.0吗?第一个查询对我不起作用(NHibernate 2.1.2.4000,无效的强制转换)。然而,看起来你正试图让所有拥有Foos的Bars,这可以这样做......

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

现在您已经拥有了Bars,在以后的代码中,您可以像这样检查F1 ......

var result = bars
    .Where(bar => bar.Foos.Any(foo => foo.F1 == "b"));