У меня есть специальная система отчетности c; У меня нет сведений во время компиляции о типе запросов или об обязательных полях Я мог бы писать деревья выражений во время выполнения, используя фабричные методы System.Linq.Expressions.Expression
, и вызывать методы LINQ, используя отражение, но Dynami c LINQ является более простым решением.
Система отчетов должна разрешать запросы, которые возвращают результат левого соединения. В объединенной таблице есть поля, которые NOT NULL
в базе данных; но поскольку это LEFT JOIN
, эти поля будут содержать NULL
для определенных записей. Сгенерированное EF6 выражение относится именно к этому, потому что выражение проецируется на тип значения, не допускающий значения NULL.
Если бы я делал это в LINQ во время компиляции, я бы явным образом приводил к типу NULL:
enum Color { Red, Green, Blue }
// using System;
// using static System.Linq.Enumerable;
// using System.Linq;
var range = Range(0, 3).Select(x => (Color)x).AsQueryable();
var qry = range.Select(x => (Color?)x);
Dynami c LINQ поддерживает явные преобразования:
// using static System.Linq.Dynamic.Core
var qry1 = range.Select("int?(it)");
, но в запросе может быть указан только конкретный c набор типов . Если я пытаюсь использовать Color
в запросе:
var qry2 = range.Select("Color(it)");
, я получаю следующую ошибку:
Не существует применимого метода «Цвет» в типе «Цвет»
и если я пытаюсь явно привести к Color?
:
var qry3 = range.Select("Color?(it)");
, я получаю:
Запрошенное значение 'Color' не найдено.
Как это сделать с помощью библиотеки Dynami c LINQ?