2012-05-06 8 views
2

Entity FrameworkLINQを使用して、検索クエリ(商品スペースの区切り付き)と商品テーブルを比較する方法を検討しています。私は基本を超えて、どちらかと以前の経験を持っていない:LINQ比較の基本的な実行

var products = new List<Product>(); 
using (var ctx = new Context()) 
{ 
    var query = id.SearchQuery.Trim().Split(' '); 
    foreach (var value in query) 
    { 
     products.AddRange(ctx.EagerProducts().Where(product => 
     product.Name.Contains(value) || 
     product.Specification.Contains(value) || 
     product.CarModel.Contains(value) || 
     product.Reference.Contains(value) || 
     product.Category.Name.Contains(value) || 
     product.Type.Name.Contains(value) || 
     product.CarBrand.Name.Contains(value) || 
     product.ProductBrand.Name.Contains(value) || 
     product.Store.Name.Contains(value))); 
    } 
    products = products.Distinct().ToList(); 
} 

return View(products); 

コードが動作し、フィルタに一致する明確な結果のリストを返しますが、何かが、まだ私には非常に適切ではないようです。私はこれがこれを行う最も効率的な方法ではないように感じる。私は正しいのですか、これはよく書かれていますか?どのように私は上記のロジックをより良い実行することができるかについての任意の提案?

P.S. EagerProductsは、熱心に読み込まれた製品を返すコンテキストの拡張です。私は考えることができる

答えて

1

私は、最終的にそれらをフェッチサーバ側で検索を行い、IMOの最善の方法は、n回(あなたquery変数内のアイテムを検索するここ数)データをフェッチしていないと言うだろう:

using (var ctx = new Context()) 
{ 
    var query = id.SearchQuery.Trim().Split(' '); 
    products = ctx.EagerProducts().Where(product => 
     query.Any(x=>product.Name.Contains(x) ||...)).Distinct().ToList(); 

} 
0

まあ、一つのことは、私は2つのだけのフィールドに入力した任意の

var products = ctx.EagerProducts() 
        .Where(product => { 
             var text = product.Name + product.Specification...; 
             return query.Any(q => text.Contains(q)); 
            }) 
        .ToList(); 

を使用している、あなたは残りの部分を追加する必要があると思います。私はおそらく、すべての検索可能なフィールドの単一の文字列を返すProductクラスのgetterを追加します。大文字小文字の区別について忘れないでください。

+0

私はそれを編集しましたテキストを1回だけ計算することでビットをさらに最適化するには、役に立たないかもしれないし、コンパイラが自動的に何かを行うかもしれない。 – Dharun

+1

まず、linq2EFで正しく動作しないと思いますが、正しく動作すれば間違っています:name = "aba"、specification = "dc"、クエリオブジェクトの唯一の項目は "abadc"です。真を返しますが、間違っています。 –

+0

@SaeedAmiriありがとう、実際にはそれまで気付かなかった(最初に待つのは良い考えだった)。 P.S.クエリ自体についてどう思いますか? –

1

IMOコードは問題ありません。しかし、ユニークな要素だけを使用したい場合は、products.Distinct()を変更してHashSet<Product>を使用し、それをリストとして返します。 (私は、クエリ、product.Name、product.Specificationなどは巨大ではないと仮定します)

*私はLINQクエリの構文が好きですが、これはスタイルの問題です。

+0

1つの質問。 'ctx.EagerProducts.Where()'節から 'HashSet'を返すことは可能ですか、それをどうやって提案しますか?ありがとう。 –

+0

はい、可能です。それをHashSetのctroに渡します(tx.EagerProducts.Where()がIEnumerableであると仮定します)。またはカスタム拡張メソッドでラップします。http://stackoverflow.com/questions/3471899/how-to-convert-linq-results-to-ハッシュセットまたはハッシュセット –

1

LINQはスピードよりもパワーのために構築されましたが、あなたが提供したコードは私の意見ではうまく見えます。別のLINQベースのアプローチがパフォーマンスの向上をもたらす可能性はありますが、その差はごくわずかです。

関連する問題