مشكلة الاستعلام الديناميكية linq-to-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
في البيان الثاني هو حقا أ Bar
لأن الاستعلام يختار ContainerBar
.
السؤال هو معرفة كيف يمكنني إضافة بند ديناميكي للاستعلام دون تغيير استعلام Origianl؟ الهدف النهائي هو أن يكون هناك قذيفة فرعية مع linq to-nhibernate.
المحلول
var query = from foo in session.Linq<Foo>()
select foo.ContainerBar;
query = query.Where(foo => foo.F1 == "abcdef");
أصبح كائن "الاستعلام" الخاص بك الآن عبارة عن iqueryable من containerbar ، لذا عندما تفعل المكان (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 ، طاقم عمل غير صالح). ومع ذلك ، يبدو أنك تحاول الحصول على جميع القضبان التي تحتوي على 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"));