1

Type表示する必要がある子の型を示す基準オブジェクトとしての配列があるとします。

モデル:

public abstract class Shape { }

public class Circle : Shape { }

public class Rectangle : Shape { }

そのようなクエリを適用する拡張メソッドを実装しました

public static IQueryable<TSource> OfTypes<TSource, TResult>(
    this IQueryable<TSource> source, 
    Expression<Func<TSource, TResult>> expression, 
    params Type[] types)
{
    if (!types.Any())
    {
        return source;
    }

    Expression finalExpression = Expression.TypeIs(expression, types.First());

    foreach (var type in types.Skip(1))
    {
        finalExpression = Expression.OrElse(
            Expression.TypeIs(expression, type),
            finalExpression);
    }

    var lambdaExpression = Expression.Lambda<Func<TSource, bool>>(
        finalExpression, 
        expression.Parameters);

    return source.Where(lambdaExpression);
}

それから私はこのようにそれを使うことができます

var types = new Type[] { typeof(Circle), typeof(Rectange) };
db.Shapres.OfTypes(s => s, types);

生成された式は次のようなものです

e => e is Circle || e is Rectange

まさに私が欲しいものですが、このエラーが発生します

LINQ 式ノード タイプ 'Lambda' は、LINQ to Entities ではサポートされていません。

私も拡張メソッドの最後の行でLinqKitAsExpandable()のメソッドを使用しました:

return source.AsExpandable().Where(lambdaExpression);

しかし、再び同じエラー。

このようにPredicateBuilderも試しましたが、再び同じエラーが発生しました

var finalExpression = PredicateBuilder.False<TSource>();

foreach (var type in types)
{
    var expressionParameter = Expression.Parameter(typeof(TSource), "it");
    var lambdaExpression = Expression.Lambda<Func<TSource, bool>>(
        Expression.TypeIs(expression, type), 
        expressionParameter);
    finalExpression.Or(lambdaExpression);
}

何が問題ですか?

問題なく を EFに変換するExpressionにはどうすればよいですか?Expression<Func<T, TResult>>

または、どうすればExpressionインスタンスをWhere拡張メソッドに渡すことができますか?

Expression.TypeIsまたは、EFにどのように使用できますか?

4

1 に答える 1