2

inクエリを使用してデータソースを効果的にクエリする式ツリーを動的に構築しようとしています。私が複製しようとしているクエリは

Countries.Where(y => Countries
                         .Where(x =>
                             x.CountryLanguage.Any(b => b.CountryID == 73) &&
                             x.CountryLanguage.Any(b => b.CountryID == 150))
                         .Select(z => z.ShortCode)
                         .Contains(y.ShortCode))

私はこれを行うために多くの方法を試しましたが、これが私の最新の試みです:

public void AddContainsWhereClause(IQueryable<T> objectSet, string predicateIdentifier)
{
    ParameterExpression pe = Expression.Parameter(typeof(T), predicateIdentifier);

    Expression expInner = Expression.Call(
        typeof(Queryable),
        "Where",
        new Type[] { typeof(T) },
        objectSet.Expression,
        Expression.Lambda<Func<T, bool>>(rootExperession, resultExpression));

    Expression expOuter = Expression.Call(
        typeof(Queryable),
        "Where",
        new Type[] { typeof(T) },
        objectSet.Expression,
        Expression.Lambda<Func<T, bool>>(expInner, pe));

}

NB rootExpression は次のとおりです。

x => x.CountryLanguage.Any(b => b.CountryID == 73) &&
     x.CountryLanguage.Any(b => b.CountryID == 150)

しかし、これは次を返します:

[ApplicationFramework.LINQBuilder.tests.Country]' は戻り値の型 'System.Boolean' には使用できません

誰かが私が間違っていることを知っていますか?

4

1 に答える 1

0

あなたが望むのは、Where呼び出しの述語コンポーネントをエミュレートするためのラムダ関数であると想定しています。

where 句はタイプ である必要がありますが、実際に を返す をFunc<TSource, bool>呼び出しています。Queryable.WhereIEnumerable

かなり複雑で保守が難しい式ツリー パスをたどるのではなく、提供された国リストの言語をサポートする国のリストを選択する必要があるだけで、本当の問題なのでしょうか?

int[] requiredCountryIds = {73, 150};

// Select countries which contain all required country IDs in their CountryLanguage set
var resultSet =
    countries.Where(
        y => requiredCountryIds.All(requiredCountryId => y.CountryLanguage.Any(b => b.CountryId == requiredCountryId)));
于 2012-06-07T01:44:58.157 に答える