Создание динамического оператора LINQ без свойства типа объекта - PullRequest
1 голос
/ 25 октября 2009

Я пытаюсь создать оператор Linq, который запрашивает оба столбца, которые существуют на моем объекте, как свойства, и те, которые не существуют, но существуют как столбцы в базе данных для объекта.

Например, у меня есть коллекция сущностей Книги. Каждая книга имеет свойство ID и Title и соответствующий столбец в базе данных. Но, допустим, таблица для Book также содержит поле столбца для Author , а у моей сущности Book этого нет.

Обычный запрос с идентификатором и названием может выглядеть следующим образом:

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

Но я также хочу динамически добавить эквивалент " AND Author = 'Name' " к вышеуказанному запросу. Свойство Author не существует в объекте Book.

Дополнительные поля и значения, которые они должны содержать, будут фактически доступны в Словаре. Поэтому мне нужно будет динамически добавить в запрос несколько AND [FieldName] = '[Value]' условий.

Это может помочь объяснить, почему мне нужно это знать, что я использую хранилище таблиц Azure и переопределил сериализацию, которая превращает сущность Book в 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.

Ответы [ 4 ]

2 голосов
/ 25 октября 2009

Без добавления Автора в Книгу вам нужно будет либо передать другой объект с Автором на нем:

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");
1 голос
/ 19 февраля 2010

Это невозможно с LINQ

0 голосов
/ 18 июля 2012

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

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;
}
0 голосов
/ 25 октября 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...