0

私は基本的な検索サービスを実装しており、いくつかの異なるリポジトリがその中に注入されています。リポジトリは、そのように使用される発現を可能にする方法があります:Entity FrameworkのこのLINQ式を簡略化することは可能ですか?

public IEnumerable<T> Select(Expression<Func<T, bool>> predicate) 
    { 
     return _dbSet.Where(predicate).AsEnumerable().ToList(); 
    } 

私は現在、私の検索サービスでは、このような文があります:

 searchResult.FoundCustomers = _customerRepository.Select(x => 
      x.FirstName.StartsWith(searchString) || 
      x.LastName.StartsWith(searchString) || 
      x.City.StartsWith(searchString) || 
      x.Country.StartsWith(searchString) || 
      x.Phone.StartsWith(searchString) || x.Phone.EndsWith(searchString)).ToList(); 

は、LINQを改善する方法はあります? searchStringの反復性は不要と思われますが、それを回避する方法があるかどうかを知るには十分にLINQをまだ知りません。

+0

http://stackoverflow.com/a/4430018/8155が、彼の 'SELECT'方法がWHERE''呼び出しているように見えます@JonesopolisそれはEF –

+0

では動作しません。 : 'return _dbSet.Where' .. – Quantic

+0

@Quantic ack良いコール。それは誤解を招く。 – Jonesopolis

答えて

0

あなたの直接の質問には:いいえ、searchStringと、検索に含める各フィールドを比較する必要があります。しかし、リポジトリのユーザの経験を改善する方法があります。

たとえば、リポジトリに検索メソッドを実装して、ユーザーコードでそのメソッドを呼び出すだけで済みます。また、あなたはあなたが今そうであるように、さらに結果をフィルタリングしたい場合には、オプションの述語を含めることができます

public IEnumerable<T> Search(string searchString, Expression<Func<T, bool>> predicate) 
{ 
    var query = _dbSet.Where(x => 
     x.FirstName.StartsWith(searchString) || 
     // ... 
     x.Phone.EndsWith(searchString)); 

    if(null != predicate) 
    { 
     query = query.Where(predicate); 
    } 

    return query.ToList(); 
} 

使用法:

var searchResults = _customerRepository.Search(searchString); 

をあなたはまた、それらを使用し、その後、カスタム属性で検索可能なフィールドの属性ができ属性を使用して動的にクエリを作成します。これにはいくつかの作業があります(実装は別の質問に任せておく方が良い)が、すべてのリポジトリに恩恵を受けるように一般的な方法で行うことができます。

使用例:

public class Customer 
{ 
    [SearchField(Mode = SearchMode.StartsWith)] 
    public string FirstName { get; set; } 

    public string DontSearchMe { get; set; } 

    [SearchField(Mode = SearchMode.StartsWith | SearchMode.EndsWith)] 
    public string Phone { get; set; } 
} 

public abstract class Repository<T> 
{ 
    public IEnumerable<T> Search(string searchString) 
    { 
     var predicate = //generate predicate from attributed properties on class T and searchString parameter 

     return _context.Set<T>().Where(predicate).ToList(); 
    } 
} 
関連する問題