代码之家  ›  专栏  ›  技术社区  ›  Afshar Mohebi

动态linq-to-nhibernate查询问题

  •  1
  • Afshar Mohebi  · 技术社区  · 14 年前

    假设我有课 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;}
    }
    

    foo 不包含名为 F1

    var query = from foo in session.Linq<Foo>()
                     select foo.ContainerBar;
    
    query = query.Where(foo => foo.F1 == "abcdef");
    

    我知道 在第二个陈述中 酒吧 ContainerBar .

    问题是知道如何在不更改origianl查询的情况下添加要查询的动态where子句?最终目标是使用linq到nhibernate进行子查询。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Răzvan Flavius Panda    11 年前
    var query = from foo in session.Linq<Foo>()
                     select foo.ContainerBar;
    
    query = query.Where(foo => foo.F1 == "abcdef");
    

    您的“query”对象现在是ContainerBar的 所以当你做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 );
    
        2
  •  0
  •   Adam Boddington    14 年前

    你在用NHibernate3.0吗?第一个查询对我不起作用(NHibernate 2.1.2.4000,无效的cast)。不过,看起来你是想得到所有有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"));