0

Linq DynamicQuerable コードを使用しています。整数の配列と、除外フィルターとして使用するフィールドを表す文字列があります。

例えば

IQuerable GetItemsWithoutExcluded(IQuerable qry, string primaryKey, List<int> excludedItems) {
        // psuedo code
        return qry.Where("p=>! p.primaryKey in excludedItems");
    }

DynamicQuerable を使用してこれを達成する方法はありますか?

4

2 に答える 2

2

これは、動的 LINQ なしで実行できます。Dynamic-LINQ は、フレームワークの本格的な市民ではありません。また、このタスクを実行する方法を変更することで、より効果的なフィルターを使用できます。現在の方法では、除外ごとにメソッドを呼び出す必要があります。

代わりにこのようなことを試してください

        List<int> allKeys = new List<int>{1,2,3,4,5,6};            
        List<int> excluded = new List<int>{ 1, 2, 3 };

        var query = from included in allKeys
                    where !excluded.Contains(included)
                    select included;

        foreach (var item in query)
            Console.WriteLine(item);
于 2012-08-17T13:33:10.783 に答える
1

通常の LINQ を使用して、次のように実装します。

public static IQueryable<T> Exclude<T>(this IQuerable<T> qry, Expression<Func<T, int>> keySelector, List<int> excludedItems)
{
    var keyGroups = qry.GroupBy(keySelector);
    var includedGroups = keyGroups.Where(g => !excludedItems.Contains(g.Key));
    return includedGroups.SelectMany(g => g);
}

次に、次のように使用できます。

public class MyClass
{
    public int Key { get; set; }
}

IQueryable<MyClass> source = // Get source data (DataContext/ObjectContext/ISession etc.)
var excludedKeys = new List<int> { 1, 3, 11 };
var result = source.Exclude(item => item.Key, excludedKeys);

動的 LINQ の更新

IQuerable GetItemsWithoutExcluded(IQuerable qry, string primaryKey, List<int> excludedItems)
{
    if(excludedItems.Count == 0)
        return qry;

    var keyChecks = excludedItems.Select(i => String.Format("p.{0} != {1}", primaryKey, i));
    var constraint = String.Join(" && ", keyChecks )
    return qry.Where("p => " + constraint);
}
于 2012-08-17T13:46:38.343 に答える