裏面我有兩個類:使用表達式樹的另一種表達樹
class Foo
{
string Name
}
class Bar
{
IList<Foo> Foos;
}
而下面的表達式樹:
var fooFilters = (Expression<Func<Foo, bool>>)(foo => foo.Name == "baz");
在NHibernate中我可以這樣寫:
Session.Query<Bar>().Where(bar => bar.Foos.Any(foo => foo.Name == "baz"));
它的工作原理。
雖然,我不能寫:
Session.Query<Bar>().Where(bar => bar.Foos.Any(fooFilters));
這是一個編譯錯誤,因爲IEnumerable.Any
的不期望Expression<TDelegate>
。
是否有可能實現?我是否必須重寫fooFilters Expression,或者有其他方法嗎?我對錶達式樹操作知之甚少,任何人都可以將我指向正確的方向嗎?
我正在使用框架3.5,爲此。
的問題是,你的類'Bar'被定義爲持有'IList的'。你不能像這樣互換'IQueryable '和'IEnumerable '。 –
2013-03-01 06:32:27
你試過Session.Query().Where(bar => bar.Foos.Any(fooFilters.Compile())); ? –
jbl
2013-03-01 09:46:53
@jbl,因爲NHibernate(和其他ORM,AFAIK)無法處理已編譯的lambdas,所以直接調用'Compile'會在運行時引發異常。在svick答案中的LINQKit讓我調用Compile,並在將表達式返回給NHibernate之前將它去掉。 – Andre 2013-03-01 21:44:26