Я не уверен, как это объяснить, поэтому сначала я покажу вам код и объясню, что он делает.
Расширение Filter
: получает выражение параметра и специальный тип фильтра, который я создал для своего приложения (IFilter
).
public static IQueryable<TSource> Filter<TSource, TProperty>(this IQueryable<TSource> source, Expression<Func<TSource, TProperty>> expression, IFilter f)
{
if (!f.IsEmpty())
{
string propertyName = ExpressionHelper.GetExpressionText(expression);
source = source.Where(f.GetWhereLambda<TSource>(propertyName));
}
return source;
}
В настоящее время возможно сделать это (упрощенно!):
var Foo = db.Foos
.Select(e => new
{
ID = e.ID, // Primary key.
Bar = e.BarID // Some nullable FK.
})
.Filter(e => e.Bar, this.someSpecialFilter);
Итак, там проблема. BarID
может быть нулевым, поэтому EF генерирует класс POCO, используя int?
, что хорошо для меня, но не для обработки моего выражения. Эта проблема впервые возникла из этого вопроса: Как создать Nullable из переменной типа? .
Описание проблемы:
Исключение Бинарный оператор Equal не определен для типов 'System.Nullable`1 [System.Int32]' и 'System.Int32'. выброшен из этого кода:
return Expression.Equal(leftExpr, rightExpr);
где leftExpr - System.Nullable1[[System.Int32
(параметр, как int?
), а rightExpr - System.Int32
(значение, как Int32`).
Вопрос:
Можно ли что-то сделать, чтобы избежать ? с int?
? Я имею в виду, возможно ли избежать получения обнуляемого типа или я должен проверить это в моем коде?
Большое спасибо,
Ricardo