2011-01-11 6 views
1

お客様の名前に特定の文字列を含めることができるデータベースから顧客オブジェクトを読み込もうとしています。私はこれをまとめるための研究などを行ってきました。このようなクエリを構築する適切な方法ですか、そうでない場合は、「より正確な」アプローチまたはより効率的なアプローチは何ですか?御時間ありがとうございます。条件が正しいか、より良い方法を探している条件

私はLINQPadを所有しており、このクエリはそれを使用して作成されました。

 

var customerName = "J"; 
var street = "Rd"; 
var city = "asdf"; 
var state = "TN"; 
var zip = "27613"; 

var query = (
    from c in customers 
     .Include("locations") 
     .Include("locations.address") 
    where 
     c.name.Contains(customerName) || 
     c.locations.Any(l => l.address.street1.Contains(street)) || 
     c.locations.Any(l => l.address.street2.Contains(street)) || 
     c.locations.Any(l => l.address.city.Contains(city)) || 
     c.locations.Any(l => l.address.state.Contains(state)) || 
     c.locations.Any(l => l.address.zip.Contains(zip)) 
    select new 
    { 
     c.id, 
     c.name, 
     c.locationId, 
     c.location, 
     Locations = 
      from l in c.locations 
      where 
       l.address.street1.Contains(street) || 
       l.address.street2.Contains(street) || 
       l.address.city.Contains(city) || 
       l.address.state.Contains(state) || 
       l.address.zip.Contains(zip) 
      select new 
      { 
       l.id, 
       l.address, 
       l.description, 
       l.locationType 
      } 
    } 
); 

query.Dump(); 
 

これは私に望ましい結果が得られないが、私は、このデータベースに最も丁寧で最善の方法をやっていることを確認します。

これは、Entity Frameworkを使用した検索のかなり典型的なパターンだと確信しています。

答えて

1

この大きな述語を2回書くのではなく、それを反転させます。また、投影するときにはIncludeはまったく必要ありません。

var query = 
    from l in c.locations 
    where 
     l.customer.name.Contains(customerName) || 
     l.address.street1.Contains(street) || 
     l.address.street2.Contains(street) || 
     l.address.city.Contains(city) || 
     l.address.state.Contains(state) || 
     l.address.zip.Contains(zip) 
    group l by l.customer into g 
    select new 
    { 
     id = g.Key.id, 
     name = g.Key.name, 
     // etc. 
     Locations = from l2 in g 
        select new 
        { 
         l2.id, 
         l2.address, 
         l2.description, 
         l2.locationType 
        } 
    }; 
+0

ありがとうCraig。あなたの答えは、私にグループ化を使用してより多くの可能性を示しています。私の検索仕様はすべてのORをとるのではなく、AND条件に変更されていますので、私はあなたの例を使って、可能であれば2つの述語を避けるために調整します。 – slimflem

関連する問題