1

次のようなクラスがあるFooBarします。

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するため、2 番目のステートメントが実際には a であることはわかっています。BarContainerBar

問題は、元のクエリを変更せずにクエリに動的な where 句を追加するにはどうすればよいかということです。最終的な目標は、linq-to-nhibernate を使用してサブクエリを作成することです。

4

2 に答える 2

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

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

「クエリ」オブジェクトは 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-09T21:10:32.457 に答える
0

NHibernate 3.0 を使用していますか? 最初のクエリは機能しません (NHibernate 2.1.2.4000、無効なキャスト)。ただし、Foos を持つすべての Bars を取得しようとしているようです。これは次のように実行できます...

IQueryable<Bar> bars = Session
    .Linq<Bar>()
    .Where(bar => bar.Foos.Any());

バーができたので、後のコードで次のように F1 をチェックできます...

var result = bars
    .Where(bar => bar.Foos.Any(foo => foo.F1 == "b"));
于 2010-11-11T06:17:00.013 に答える