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 回答