2012-05-08 18 views
3
のOR

を実行します。私は、私はむしろ、思いOR例えば私は2 IQueryables持っている2 LINQ IQueryables

public static IQueryable<Counterparty> SearchByCodeOrName(this IQueryable<Counterparty> queryable, string searchQuery) 
    { 
     // return SearchByName(searchQuery) OR SearchByCode(searchQuery) 
    } 

として2つのクエリを組み合わせた別のIQueryableを作成したい

public static IQueryable<Counterparty> SearchByCode(this IQueryable<Counterparty> queryable, string searchQuery) 
    { 
     return queryable.Where(x => x.Code.StartsWith(searchQuery.ToUpper())); 
    } 

    public static IQueryable<Counterparty> SearchByName(this IQueryable<Counterparty> queryable, string searchQuery) 
    { 
     return queryable.Where(x => x.Name.ToLower().Contains(searchQuery.ToLower())); 
    } 

をコードの重複を避けるため、新しいラムダ式を書き直すのではなく、既存のクエリー可能なものを再利用したいWhere(x=> x.Code.StartsWith.... || x.Name.Contains.....)

答えて

1

あなたが再利用できるようにしたいんどのようなコードに応じて、これはあなたのクエリ条件の内部の仕組みを複製していないところにそれを行うための別の方法が考えられます。

private static Func<Counterparty, string, bool> CodeStartsWith = (x, searchQuery) => x.Code.StartsWith(searchQuery.ToUpper()); 

    private static Func<Counterparty, string, bool> NameContains = (x, searchQuery) => x.Name.Contains(searchQuery.ToLower()); 

    public static IQueryable<Counterparty> SearchByCode(this IQueryable<Counterparty> queryable, string searchQuery) 
    { 
     return queryable.Where(x => CodeStartsWith(x, searchQuery)); 
    } 

    public static IQueryable<Counterparty> SearchByName(this IQueryable<Counterparty> queryable, string searchQuery) 
    { 
     return queryable.Where(x => NameContains(x, searchQuery)); 
    } 

    public static IQueryable<Counterparty> SearchByCodeOrName(this IQueryable<Counterparty> queryable, string searchQuery) 
    { 
     return queryable.Where(x => NameContains(x, searchQuery) || CodeStartsWith(x, searchQuery)); 
    } 
+1

これは実際に私自身が思いついた方法です!いい答えだ! – reach4thelasers

+0

@ reach4thelasers:[AlbaharisのPredicateBuilder](http://www.albahari.com/nutshell/predicatebuilder.aspx)と[このEF/ORMのフレンドリーなバージョン](http://petemontgomery.wordpress)をチェックしてください。 com/2011/02/10/a-universal-predicatebuilder /)と[リンク先の説明](http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities -combining-predicates.aspx)では、式を使用して問題の問題を解決する方法について説明します。 :-) –

5

おそらく2つの結果を一緒に表示する

public static IQueryable<Counterparty> SearchByCodeOrName(this IQueryable<Counterparty> queryable, string searchQuery) 
{ 
    return SearchByName(searchQuery).Union(SearchByCode(searchQuery)) 
} 
+0

間違いこれがEntity Frameworkのデータベースへの2回のラウンドトリップを引き起こすかどうかはわかりません。 – reach4thelasers