我不知道如何解释这一点,所以我先向你展示一些代码并解释它的作用。
扩展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?
的?吗?我的意思是,是否可以避免接收可以为空的类型,或者我应该在我的代码中检查这个吗?
非常感谢,
里卡多
答案 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);