質問

I'm not sure how to explain this, so I'm gonna show you some code first and explain what it does.

Extension Filter: receives a parameter expression and a special type of filter I've built for my application (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;
}

Currently, it's possible to do this (simplified!):

var Foo = db.Foos
.Select(e => new
{
    ID = e.ID, // Primary key.
    Bar = e.BarID // Some nullable FK.
})
.Filter(e => e.Bar, this.someSpecialFilter);

So, there's a problem over there. BarID can be null, so the EF is generating a POCO class using int?, which is fine for me, but not for my expression processing. This problem first originated this question: How to create a Nullable<T> from a Type variable?.

The problem description:

The exception The binary operator Equal is not defined for the types 'System.Nullable`1[System.Int32]' and 'System.Int32'. is throwed from this code:

return Expression.Equal(leftExpr, rightExpr);

where leftExpr is a System.Nullable1[[System.Int32 (the paramater, as int?) and rightExpr is a System.Int32 (the value, as Int32`).

The question:

Can I do something to avoid the ? from int?? I mean, is it possible to avoid receiving a nullable type or should I check for this in my code?

Thanks a lot,

Ricardo

役に立ちましたか?

解決 2

The current solution I've found is use the navigation property and just throw an exception when something is Nullable.

    if ((expression.ReturnType.IsGenericType) && (expression.ReturnType.GetGenericTypeDefinition() == typeof(Nullable<>)))
    {
        throw new Exception("The property expression cannot be Nullable.");
    }

And the use is something like this:

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

他のヒント

You want this:

Can I do something to avoid the '?' from 'int?' ?

and then you explain this:

there are situations where th FK is nullable

So i understand you can't avoid the nullable type

this may be a conception issue, or i miss something there

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top