我可以强制表达式与非可空参数一起使用吗?

时间:2011-08-15 21:51:44

标签: c# c#-4.0 nullable non-nullable

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

扩展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可以为null,因此EF使用int?生成POCO类,这对我来说很好,但不适用于我的表达式处理。这个问题首先引发了这个问题:How to create a Nullable<T> from a Type variable?

问题描述:

异常没有为类型'System.Nullable`1 [System.Int32]'和'System.Int32'定义二进制运算符Equal。从此代码中抛出:

return Expression.Equal(leftExpr, rightExpr);

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

问题:

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

非常感谢,

里卡多

2 个答案:

答案 0 :(得分:0)

你想要这个:

  

我能做些什么来避免'?'来自'int?' ?

然后你解释一下:

  

有些情况下FK可以为空

所以我明白你无法避免可空类型

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

答案 1 :(得分:0)

我发现当前的解决方案是使用navigation属性,只有当某些东西可以为空时抛出异常。

    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);