Создание динамического оператора LINQ без наличия свойства Entity Type
-
06-07-2019 - |
Вопрос
Я пытаюсь создать оператор Linq, который запрашивает оба столбца, которые существуют в моей сущности как свойства, и те, которые не существуют, но как столбцы в базе данных для сущности.
Например, у меня есть коллекция книжных объектов.Каждая книга имеет идентификатор и свойство Title, а также соответствующий столбец в базе данных.Но, допустим, таблица для Book также содержит поле столбца для Автор и в моей Книжной сущности этого нет.
Обычный запрос, включающий идентификатор и заголовок, может выглядеть следующим образом:
Books.Where(b=>b.ID == 123 && b.Title == "Title")
Но я хочу также динамически добавлять эквивалент " И Автор = 'Имя' " также и на вышеприведенный запрос.Свойство Author не существует для объекта Book.
Дополнительные поля и значения, которые они должны содержать, на самом деле будут доступны в Словаре.Поэтому мне нужно будет динамически добавлять несколько И [Имя_поля] = '[Значение]' условия для запроса.
Это могло бы помочь объяснить, зачем мне это нужно, чтобы знать, что я использую Azure Table Storage и переопределил сериализацию, которая превращает объект Book в XML, хранящийся в Azure.
Редактировать -
Я пробовал использовать динамическую библиотеку Linq, но это не работает.
Books.Where(b=>b.ID == 123 && b.Title == "Title").Where("Author = @0", "SomeName").ToList();
Бросает:System.Linq.Динамическое исключение.ParseException:В типе "Книга" не существует свойства или поля "Автор".
Также,
Я знаю, как использовать Книги.AddQueryOption("$filter","Авторский эквалайзер 'SomeName'") работает, когда используется сам по себе.Но я понятия не имею, как использовать AddQueryOption вместе с существующим оператором Where .
Решение 2
Это невозможно с LINQ
Другие советы
Без добавления Автора в Book вам либо пришлось бы передать другой объект с указанием автора на нем:
var x = new { Author="SomeName" };
Books.Where(b=>b.Id == 1 && b.Title == "Alpha").Where("@1.Author == @0", "SomeName", x);
Или унаследуйте от Book и добавьте свойство Author только для этой цели:
public class BookEx : Book {
public string Author { get; set; }
}
Books.Cast<BookEx>().Where(b=>b.Id == 1 && b.Title== "Alpha").Where("Author == @0", "SomeName");
Взгляните на Динамический Linq библиотека.
Попробуйте следующий код:
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;
}