動的linqからnhibernateのクエリの問題
-
30-09-2019 - |
質問
クラスがあるとします 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;}
}
次の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"));
所属していません StackOverflow