質問

クラスがあるとします 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番目のステートメントでは、本当にです Bar クエリが選択されるため ContainerBar.

問題は、Origianlクエリを変更せずにQueryにダイナミックな場所を追加するにはどうすればよいですか?最終的な目標は、LinqからnhibernateのサブQuerieを持つことです。

役に立ちましたか?

解決

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 );

他のヒント

Nhibernate 3.0を使用していますか?最初のクエリは私にとっては機能しません(Nhibernate 2.1.2.4000、無効なキャスト)。ただし、このようにできるフースのあるすべてのバーを手に入れようとしているようです...

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

バーができたので、後のコードでは、このようにF1を確認できます...

var result = bars
    .Where(bar => bar.Foos.Any(foo => foo.F1 == "b"));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top