2010-11-09 60 views
1

假设我有类FooBar如下:动态LINQ到NHibernate的查询问题

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进行子查询。现在

回答

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

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

你的“查询”对象是一个IQueryable ContainerBar的 所以当你做在哪里(富=> 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); 
+0

但where子句必须在运行时添加。 – 2010-11-10 05:07:06

+0

我已经更新了我的答案 – mathieu 2010-11-10 08:04:57

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")); 
+0

不,我正在使用NHibernate 2.1.2 – 2010-11-13 05:55:54