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

时间:2013-01-17 16:18:52

标签: linq entity-framework

使用以下代码,如何获得包含任何zip列表的返回,但只包含具有街道地址目的的记录?目前,这会返回zip或街道地址的匹配项。

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();

1 个答案:

答案 0 :(得分:1)

我认为你在寻找的是:

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=="Street Address")重要的是你的实体属性组件在.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();

我更喜欢可读性。我希望最终执行的查询无论哪种方式都是相同的。