Можно ли принудительно использовать выражение с ненулевым параметром? - PullRequest
1 голос
/ 16 августа 2011

Я не уверен, как это объяснить, поэтому сначала я покажу вам код и объясню, что он делает.

Расширение 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

Ответы [ 2 ]

0 голосов
/ 16 августа 2011

Текущее решение, которое я нашел, - это использовать свойство навигации и просто выдавать исключение, когда что-то имеет значение Nullable.

    if ((expression.ReturnType.IsGenericType) && (expression.ReturnType.GetGenericTypeDefinition() == typeof(Nullable<>)))
    {
        throw new Exception("The property expression cannot be Nullable.");
    }

И использование примерно так:

var Foo = db.Foos
.Select(e => new
{
    ID = e.ID, // Primary key.
    Bar = e.Bar.ID // Use the PK from Bar's navigation property.
})
.Filter(e => e.Bar, this.someSpecialFilter);
0 голосов
/ 16 августа 2011

Вы хотите это:

Могу ли я сделать что-нибудь, чтобы избежать '?'от 'int?'?

и затем вы объясните это:

есть ситуации, когда FK обнуляется

Так что я понимаю, что вы не можете избежатьобнуляемый тип

это может быть проблемой зачатия, или я что-то там пропускаю

...