繁体   English   中英

使用动态linq过滤对象列表

[英]using dynamic linq to filter a list of objects

我有两个这样的班

public class Error{
   public string Code{get;set;}
   public string Description{get;set;}
}

public class Row{
   public List<Error> Errors {get;set;}
   ....
}

因此,对于每一行,可能存在更多错误。 是否可以使用动态linq选择具有错误代码的行(例如Code1)?

因此,如果该行包含Code1和Code2,我想选择该行。

如果在下面的示例中查询具有行列表,我想要这样的查询

query.Where("Errors != null && Errors.Code.contains('Code1')")

是否可以使用动态linq选择具有错误代码的行(例如Code1)?

我的理解方式是这样的

IQueryable<Row> query = ...;
string code = "Code1";

并且您想要等效于以下静态查询的Dynamic LINQ:

var result = query
   .Where(row => row.Errors != null && row.Errors.Any(error => error.Code == code));

由于在Dynamic LINQ中,每个Enumerable扩展方法lambda都输入一个单独的“作用域”,因此可以通过特殊的it标识符或根本没有标识符来访问内部的成员。 它还允许您传递参数,并使用@p0@p1等按索引在查询字符串中引用它们。

因此,上面的等效动态LINQ查询可能是这样的:

var result = query
    .Where("Errors != null && Errors.Any(Code == @0)", code);

如果要使用string.Contains而不是完全匹配,只需将Code == @0替换为Code.Contains(@p0)

当然,您可以将字符串文字值嵌入其中,但是请记住,它需要用双引号( " )括起来:

var result = query
    .Where("Errors != null && Errors.Any(Code == \"Code1\")");

我认为这是您要寻找的:

var codes=new List<string>{"Code1","Code2"}; 
// given a list of codes you want those rows that contains all codes
var result= rows.Where(r=> codes.All(c=>r.Errors.Any(e=>e.Code==c)));

为了避免对错误列表进行空检查,建议您在空的构造函数中初始化列表:

public Row()
{
   Errors=new List<Error>();
}

使用linq的where扩展方法。 并检查代码是否等于Code1或Code2并将结果转换为Error列表

 List<Error> rows = row.Errors
            .Where(x => x.Code == "Code1" && x.Code == "Code2")
            .ToList();

要么

var result = (from x in row.Errors
            where x.Code == "Code1" && x.Code == "Code2"
            select x).ToList();
IEnumerable<Row> rowCollection = ...; //your rows
var result = rowCollection
    .Where(r => r.Code.Contains("Code1") && r.Code.Contains("Code2"))
    .ToList();

您真正想要做的是使用PredicateBuilder之类的东西: http : //www.albahari.com/nutshell/predicatebuilder.aspx

IQueryable<Error> SearchProducts(Row row, string[] codes, string[] keywords)
{
    var predicate = PredicateBuilder.False<Error>();

    foreach (string code  in codes)
    {
        string temp = code;
        predicate = predicate.Or(p => p.Code.Contains(temp));
    }
    foreach (string keyword in keywords)
    {
        string temp = keyword;
        predicate = predicate.Or(p => p.Description.Contains(temp));
    }
    return row.Errors.AsQueryable().Where(predicate);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM