これをどう説明したらいいのかわからないので、最初にコードをいくつか示して、それが何をするのかを説明します。
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は null になる可能性があるため、EF は を使用して POCO クラスを生成していますint?。これは私にとっては問題ありませんが、式の処理には適していません。この問題は最初に次の質問を引き起こしました: Type 変数から Nullable<T> を作成する方法は? .
問題の説明:
例外二項演算子 Equal は、型 'System.Nullable`1[System.Int32]' および 'System.Int32' に対して定義されていません。このコードからスローされます:
return Expression.Equal(leftExpr, rightExpr);
ここで、 leftExpr はSystem.Nullable1[[System.Int32(パラメーター、 as int?) であり、 rightExpr はSystem.Int32(値、 Int32` として) です。
質問:
を回避するために何かできますか?からint?? つまり、null 許容型の受信を回避することは可能ですか、それともコードでこれを確認する必要がありますか?
どうもありがとう、
リカルド