2012-05-06 74 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

好一件事我能想到的是使用任何

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

我只有兩個字段中鍵入,你必須增加休息。我可能會在Product類中添加一個getter,返回所有可搜索字段的單個字符串。不要忘記區分大小寫。

+0

,我剪輯通過僅計算一次文本來使其更加優化,可能是無用的,而編譯器會自動執行。 – Dharun

+1

首先,我認爲這不會在linq2EF中正常工作,如果它工作,它是錯誤的,假設:name =「aba」,specification =「dc」,並且查詢對象中唯一的項目是「abadc」,您的方法返回true,但它是錯誤的。 –

+0

@SaeedAmiri謝謝,實際上並沒有注意到,直到現在(首先等待是個好主意)。附:您對查詢本身有什麼看法? –

1

IMO你的代碼很好*。但是,如果您只想使用唯一元素HashSet<Product>,然後將其作爲列表返回,則我將更改products.Distinct()。 (我假設查詢,product.Name,product.Specification等不是很大)

*我更喜歡LINQ查詢語法,但這只是風格問題。

+0

有一個問題。是否可以從'ctx.EagerProducts.Where()'子句返回'HashSet',或者你如何建議我這樣做。謝謝。 –

+0

是的,這是可能的。將它傳遞給HashSet的ctro(假設tx.EagerProducts.Where()是IEnumerable)或將其包裝在自定義擴展方法中http://stackoverflow.com/questions/3471899/how-to-convert-linq-results-to- HashSet的或 - hashedset –

1

LINQ的功能比速度更多,但您提供的代碼在我看來看起來很好。另一種基於LINQ的方法可能會產生較小的性能提升,但我懷疑這種差異可以忽略不計。