假设我有如下的类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。
问题是知道如何在不更改原始查询的情况下添加动态where子句到查询中?最终目标是使用linq- to -nhibernate实现子查询。
发布于 2010-11-10 05:10:32
var query = from foo in session.Linq<Foo>()
select foo.ContainerBar;
query = query.Where(foo => foo.F1 == "abcdef");您的"query“对象现在是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-11 14:17:00
您使用的是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"));https://stackoverflow.com/questions/4138093
复制相似问题