动态的linq to-nhibrenate查询问题
-
30-09-2019 - |
题
假设我有课 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;}
}
遵循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查询的情况下添加一个动态,而该子句要查询?最终目标是让Linq-to-Nhibernate的子征服。
解决方案
var query = from foo in session.Linq<Foo>()
select foo.ContainerBar;
query = query.Where(foo => foo.F1 == "abcdef");
现在,您的“查询”对象是容器的可笑性,因此当您执行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 );
其他提示
您正在使用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"));
不隶属于 StackOverflow