سؤال

افترض أن لدي دروس 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"));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top