Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对非sql类型的操作使用Linq DynamicQuery_C#_Linq_Dynamic Linq - Fatal编程技术网

C# 对非sql类型的操作使用Linq DynamicQuery

C# 对非sql类型的操作使用Linq DynamicQuery,c#,linq,dynamic-linq,C#,Linq,Dynamic Linq,我正在使用Linq DynamicQuery代码。我有一个整数数组和一个表示要用作排除过滤器的字段的字符串 比如说 IQuerable GetItemsWithoutExcluded(IQuerable qry, string primaryKey, List<int> excludedItems) { // psuedo code return qry.Where("p=>! p.primaryKey in excludedItems");

我正在使用Linq DynamicQuery代码。我有一个整数数组和一个表示要用作排除过滤器的字段的字符串

比如说

IQuerable GetItemsWithoutExcluded(IQuerable qry, string primaryKey, List<int> excludedItems) {
        // psuedo code
        return qry.Where("p=>! p.primaryKey in excludedItems");
    }
IQuerable GetItemsWithoutExcluded(IQuerable qry,字符串主键,列表排除项){
//伪代码
返回qry.Where(“p=>!p.primaryKey in excludedItems”);
}

你知道我将如何使用DynamicQuery实现这一点吗?

你可以在没有动态LINQ的情况下实现这一点。DynamicLinq不是该框架的正式成员。通过改变完成此任务的方式,您可以使用更有效的过滤器。按照现在的方式,每次排除都需要调用该方法

试试这样吧

        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);
List allKeys=新列表{1,2,3,4,5,6};
排除列表=新列表{1,2,3};
var query=from包含在所有键中
哪里排除。包含(包括)
选择包含的;
foreach(查询中的var项)
控制台写入线(项目);

您可以在没有动态LINQ的情况下执行此操作。DynamicLinq不是该框架的正式成员。通过改变完成此任务的方式,您可以使用更有效的过滤器。按照现在的方式,每次排除都需要调用该方法

试试这样吧

        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);
List allKeys=新列表{1,2,3,4,5,6};
排除列表=新列表{1,2,3};
var query=from包含在所有键中
哪里排除。包含(包括)
选择包含的;
foreach(查询中的var项)
控制台写入线(项目);

我将使用普通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);
}
公共静态IQueryable Exclude(此IQueryable qry、表达式键选择器、列表excludedItems)
{
var keyGroups=qry.GroupBy(键选择器);
var includedGroups=keyGroups.Where(g=>!excludedItems.Contains(g.Key));
返回includedGroups。选择many(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);
公共类MyClass
{
公共int密钥{get;set;}
}
IQueryable source=//获取源数据(DataContext/ObjectContext/ISession等)
var excludedKeys=新列表{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);
}
IQuerable GetItemsWithoutExcluded(IQuerable qry,字符串主键,列表排除项)
{
if(excludedItems.Count==0)
返回qry;
var-keyChecks=excludedItems.Select(i=>String.Format(“p.{0}!={1}”,primaryKey,i));
var constraint=String.Join(&&),keyChecks)
返回qry.Where(“p=>”+约束);
}

我将使用普通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);
}
公共静态IQueryable Exclude(此IQueryable qry、表达式键选择器、列表excludedItems)
{
var keyGroups=qry.GroupBy(键选择器);
var includedGroups=keyGroups.Where(g=>!excludedItems.Contains(g.Key));
返回includedGroups。选择many(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);
公共类MyClass
{
公共int密钥{get;set;}
}
IQueryable source=//获取源数据(DataContext/ObjectContext/ISession等)
var excludedKeys=新列表{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);
}
IQuerable GetItemsWithoutExcluded(IQuerable qry,字符串主键,列表排除项)
{
if(excludedItems.Count==0)
返回qry;
var-keyChecks=excludedItems.Select(i=>String.Format(“p.{0}!={1}”,primaryKey,i));
var constraint=String.Join(&&),keyChecks)
返回qry.Where(“p=>”+约束);
}

这里的问题是,我必须执行查询并点击数据库,然后进行筛选。目标是过滤原始查询。这里的问题是我必须执行查询并点击数据库然后过滤。我们的目标是过滤原始查询。@Kenoyer130发布了一个更新的答案,它可能不是最有效的答案,但它应该能够工作,并且有望足以消除否决票:)@Kenoyer130发布了一个更新的答案,它可能不是最有效的答案,但它应该能够工作,并且有望足以消除否决票:)