linq - 如何创建一个必须满足两个值的谓词,其中一个是值列表?

标签 linq entity-framework

使用以下代码如何获得包含任何邮政编码列表但仅包含街道地址目的记录的返回?这当前会返回邮政编码或街道地址的匹配项。

var zipPredicate = PredicateBuilder.False<NameAddress>();
        List<string> zips = new List<string>();
        zips.Add("90210");
        zips.Add("90211");
        foreach (var item in zips)
        {
            zipPredicate = zipPredicate.Or(n=> n.ZIP.Contains(item));        
        }
            zipPredicate = zipPredicate.And(n=> n.Purpose=="Street Address");        
        var zipResult = from s in NameAddresses 
        .AsExpandable()
        .Where(zipPredicate)
        select new{s.ID, s.ZIP, s.Purpose};

zipResult.Dump();

最佳答案

我想你要找的是:

var zipPredicate = PredicateBuilder.False<NameAddress>();
    List<string> zips = new List<string>();
    zips.Add("90210");
    zips.Add("90211");
    foreach (var item in zips)
    {
        zipPredicate = zipPredicate.Or(n=> n.ZIP.Contains(item) && n.Purpose=="Street Address");        
    }        
    var zipResult = from s in NameAddresses 
    .AsExpandable()
    .Where(zipPredicate)
    select new{s.ID, s.ZIP, s.Purpose};

zipResult.Dump();

编辑

还有一件事,如果你想放弃构建谓词,你应该能够做类似的事情:.Where(n=>zips.Contains(n.ZIP) && n.Purpose= ="街道地址") 重要的一点是您的实体属性组件位于 .Contains() 中。这会将您的代码缩短为:

    List<string> zips = new List<string>();
    zips.Add("90210");
    zips.Add("90211");

    var zipResult = from s in NameAddresses 
    .AsExpandable()
    .Where(n=>zips.Contains(n.ZIP) && n.Purpose=="Street Address")
    select new{s.ID, s.ZIP, s.Purpose};

zipResult.Dump();

我更喜欢它的可读性。我希望最终执行的查询是相同的。

关于linq - 如何创建一个必须满足两个值的谓词,其中一个是值列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14383460/

相关文章:

c# - 如何在 EF6 中使用 group by 从表中查询?

c# - linq 查询 guid 列表

c# - 类上的扩展方法 - 好主意还是坏主意?

asp.net-mvc - EF 上下文管理

c# - 使用 EF 使用 sum 进行慢速 mysql 查询

c# - IQueryable Include 未给出正确的结果

entity-framework - 部署到 Azure 后,EF 代码首次迁移未运行

c# - DbContext 只是我的数据库在内存中的架构或架构和记录

c# - 为什么 LINQ 在我的查询中使用了错误的数据类型,而在 EF 架构中正确声明了它?

c# - 在 foreach 循环中使用 predicatebuilder 时遇到问题