3

次のコードを使用して、郵便番号リストのいずれかを含むが、住所を目的とするレコードのみを含むリターンを取得するにはどうすればよいですか? これは現在、郵便番号または番地のいずれかの一致を返します。

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

編集

もう1つ、述語の作成をやめたい場合は、次のようなことができるはずです.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 に答える