динамические проекции в EF6 - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь создать динамическую проекцию с Entity Framework 6, но пока мне не удалось.В зависимости от определенных условий я хочу включить или исключить определенные данные в результате проецирования.

Вот что будет работать:

Dim carQueryable = currentContext.Car.Include("ModellVariant.Modell.Make")

 if (includeEquipment) then
    return carQueryable.
        Select(Function(car) New CarFlatRecord With{
            .Fahrzeug = car,
            .ModellVariant = car.ModellVariant,
            .Modell = car.ModellVariant.Modell,
            .Make = car.ModellVariant.Modell.Make,
            .Equipment = car.Equiptment
            } )
 ELSE
    return carQueryable.
        Select(Function(car) New CarFlatRecord With{
            .Fahrzeug = car,
            .ModellVariant = car.ModellVariant,
            .Modell = car.ModellVariant.Modell,
            .Make = car.ModellVariant.Modell.Make} )
END IF

Моя проблема в том, что у меня уже есть три бинарных условия, аналогичныхincludeEquipment.Таким образом, простое решение if / then уже потребовало бы 8 различных путей.Я рассматривал Expressions как решение, но кажется, что EF не способен обрабатывать любые сложные сценарии.

Я пытался работать с if() в предложении with, и это дает правильно заполненный вывод, но в SQLтаблицы все еще объединены (что является моей главной проблемой, которую я хочу избежать).

(Ответы в c # и vb приветствуются, поэтому я добавил теги)

1 Ответ

1 голос
/ 18 июня 2019

Говоря о динамике для Entity Framework, часто есть 2 простых решения (одно бесплатное, одно платное).

Для обоих решений вам нужно будет создать строку, содержащую вашу динамическую проекцию.

Бесплатно

LINQ Dynamic: https://github.com/kahanu/System.Linq.Dynamic/wiki/Dynamic-Expressions

Очень популярная библиотека, которая позволяет легко обрабатывать этот сценарий

var list = context.Customers.Select("new(Name, IsActive)").ToList();

Я рекомендую эту библиотеку, если вы хотитеобрабатывать самые основные сценарии

Платные

Отказ от ответственности : я владелец проекта Eval-Expression.NET

Эта библиотека более мощная благодаря использованию дерева выраженийОн поддерживает тот же синтаксис, что и C #

var list = context.Customers.SelectDynamic(x => "new { x.Name, x.IsActive }").ToList();

Эта библиотека может использоваться для более сложных сценариев.Это позволяет вам компилировать и выполнять динамический код C # во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...