C# 对非sql类型的操作使用Linq DynamicQuery
我正在使用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");
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发布了一个更新的答案,它可能不是最有效的答案,但它应该能够工作,并且有望足以消除否决票:)