3

使用以下代码,我如何获得包含任何 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();
4

1 回答 1

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

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

于 2013-01-17T16:25:36.643 回答