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は 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 許容型の受信を回避することは可能ですか、それともコードでこれを確認する必要がありますか?

どうもありがとう、

リカルド

4

2 に答える 2

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 に答える
0

あなたはこれを求めている:

「?」を避けるために何かできることはありますか?'int?' から ?

そして、あなたはこれを説明します:

FK が null 可能である状況があります

だから私はあなたがnull許容型を避けることができないことを理解しています

これはコンセプトの問題かもしれません。

于 2011-08-16T18:15:53.613 に答える