首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态linq-to-nhibernate查询问题

动态linq-to-nhibernate查询问题
EN

Stack Overflow用户
提问于 2010-11-10 04:13:34
回答 2查看 2.1K关注 0票数 1

假设我有如下的类FooBar

代码语言:javascript
复制
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的属性。

代码语言:javascript
复制
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实现子查询。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-10 05:10:32

代码语言:javascript
复制
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属性。

您应该执行以下操作:

代码语言:javascript
复制
var bars = from foo in session.Linq<Foo>()
            where foo.F1 == "abcdef"
            select foo.ContainerBar;

或者:

代码语言:javascript
复制
var q = session.Linq<Foo>();

// if some condition
q = q.Where( foo => foo.F1 == "abcdef" );

var bars = q.Select( foo => foo.ContainerBar );
票数 2
EN

Stack Overflow用户

发布于 2010-11-11 14:17:00

您使用的是NHibernate 3.0吗?第一个查询对我不起作用(NHibernate 2.1.2.4000,无效转换)。然而,看起来你正在尝试获得所有有Foos的酒吧,这可以像这样做…

代码语言:javascript
复制
IQueryable<Bar> bars = Session
    .Linq<Bar>()
    .Where(bar => bar.Foos.Any());

现在你有了条形图,在后面的代码中,你可以像这样检查F1 ...

代码语言:javascript
复制
var result = bars
    .Where(bar => bar.Foos.Any(foo => foo.F1 == "b"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4138093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档