إنشاء عبارة LINQ ديناميكية دون الحاجة إلى خاصية نوع الكيان

StackOverflow https://stackoverflow.com/questions/1619029

سؤال

أحاول إنشاء عبارة Linq تستعلم عن كل من الأعمدة الموجودة في الكيان الخاص بي كخصائص وتلك التي لا توجد ولكنها موجودة كأعمدة في قاعدة بيانات الكيان.

على سبيل المثال، لدي مجموعة من كيانات الكتاب.يحتوي كل كتاب على خاصية معرف وعنوان وعمود مطابق في قاعدة البيانات.ولكن، لنفترض أن جدول الكتاب يحتوي أيضًا على حقل عمود لـ مؤلف وكيان كتابي لا يملك هذا.

قد يبدو الاستعلام العادي الذي يتضمن المعرف والعنوان كما يلي:

Books.Where(b=>b.ID == 123 && b.Title == "Title")

لكنني أريد أيضًا إضافة ما يعادل " والمؤلف = "الاسم" "للاستعلام أعلاه أيضًا.خاصية المؤلف غير موجودة في كائن الكتاب.

الحقول الإضافية والقيم التي ينبغي أن تحتوي عليها ستكون متاحة بالفعل في القاموس.لذلك سأحتاج إلى إضافة متعددة ديناميكيًا AND [اسم الحقل] = '[القيمة]' شروط الاستعلام.

قد يكون من المفيد توضيح سبب حاجتي إلى ذلك لمعرفة أنني أستخدم Azure Table Storage وقد تجاوزت التسلسل الذي يحول كيان الكتاب إلى XML المخزن في Azure.

يحرر -

لقد حاولت استخدام مكتبة Dynamic Linq لكنها لا تعمل.

Books.Where(b=>b.ID == 123 && b.Title == "Title").Where("Author = @0", "SomeName").ToList();

رميات:System.Linq.Dynamic.ParseException:لا توجد خاصية أو حقل "المؤلف" موجود في النوع "كتاب".

أيضًا،

أنا أعرف استخدام Books.AddQueryOption("$filter"،"Author eq 'SomeName'") يعمل عند استخدامه من تلقاء نفسه.لكن ليس لدي أي فكرة عن كيفية استخدام AddQueryOption مع عبارة Where الموجودة.

هل كانت مفيدة؟

المحلول 2

هذا غير ممكن مع LINQ

نصائح أخرى

بدون إضافة "مؤلف" إلى الكتاب، سيتعين عليك إما تمرير كائن آخر به "مؤلف":

var x = new { Author="SomeName" };  
    Books.Where(b=>b.Id == 1 && b.Title == "Alpha").Where("@1.Author == @0", "SomeName", x);

أو وراثة من الكتاب وإضافة خاصية المؤلف لهذا الغرض فقط:

public class BookEx : Book {
    public string Author { get; set; }
}

Books.Cast<BookEx>().Where(b=>b.Id == 1 && b.Title== "Alpha").Where("Author == @0", "SomeName");

جرب الكود التالي:

var result = _tofiObjectList.Where(o => o.GetType() == mainObjType)
    .AsQueryable().Cast(relation.MainObject.EntityType).Where(relation.MainObject.Filter);

هذه طريقة تمديد ل IQueryable يكتب:

public static IQueryable Cast(this IQueryable source, string type)
{
    switch (type)
    {
        case "TofiDataCollection.Service.TofiEntity.Obj":
            return source.Cast<Obj>();
    }
    return source;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top