1

我不知道如何解释这一点,所以我将首先向您展示一些代码并解释它的作用。

Extension 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?,这对我来说很好,但不适用于我的表达式处理。这个问题首先起源于这个问题:How to create a Nullable<T> from a Type variable?.

问题描述:

例外二元运算符 Equal 没有为类型“System.Nullable`1[System.Int32]”和“System.Int32”定义。从此代码中抛出:

return Expression.Equal(leftExpr, rightExpr);

其中 leftExpr 是 a System.Nullable1[[System.Int32(参数,as int?),rightExpr 是 a System.Int32(值,as Int32`)。

问题:

我可以做些什么来避免? int?? 我的意思是,是否可以避免接收可为空的类型,或者我应该在我的代码中检查这一点?

非常感谢,

里卡多

4

2 回答 2

0

你要这个:

我可以做些什么来避免'?从'int?' ?

然后你解释一下:

在某些情况下 th FK 可以为空

所以我明白你不能避免可以为空的类型

这可能是一个概念问题,或者我错过了那里的东西

于 2011-08-16T18:15:53.613 回答
0

我找到的当前解决方案是使用导航属性,并在某些内容为 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);
于 2011-08-16T19:38:33.853 回答