Создание динамического оператора LINQ без наличия свойства Entity Type

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

Вопрос

Я пытаюсь создать оператор 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 библиотека.

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Попробуйте следующий код:

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