2010-11-09 77 views
1

假設我有類FooBar如下:動態LINQ到NHibernate的查詢問題

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查詢的情況下添加一個動態where子句來進行查詢?最終目標是使用linq-to-nhibernate進行子查詢。現在

回答

3
var query = from foo in session.Linq<Foo>() 
       select foo.ContainerBar; 

query = query.Where(foo => foo.F1 == "abcdef"); 

你的「查詢」對象是一個IQueryable ContainerBar的 所以當你做在哪裏(富=> 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); 
+0

但where子句必須在運行時添加。 – 2010-11-10 05:07:06

+0

我已經更新了我的答案 – mathieu 2010-11-10 08:04:57

0

你使用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")); 
+0

不,我正在使用NHibernate 2.1.2 – 2010-11-13 05:55:54