2013-07-23 29 views
0

我寫了Linq查詢來更快地檢索記錄。但它需要更多的時間來檢索,而傳遞本地收集值Linq查詢:LinQ:如何編寫單個查詢來以有效方式傳遞List /字符串集合時檢索記錄?

在這裏我工作LinQ查詢與實體框架。我需要基於作爲字符串集合傳遞的所有platformId獲取forumthread這裏

目標:我們如何使用更有效的方式在單個linQ查詢中檢索具有匹配id集合的記錄? 例如:慢速執行查詢:

public void GetThreadCollection(string[] platformid) 
{ 
    using (SupportEntity support=new SupportEntity()) 
    { 
     var ThreadCollection = (from platid in platformid 
           from thread in support.ForumThread 
           from platform in support.Platforms 
           where platid == thread.Platformid && 
             platform.PlatformId==platid 
           select new 
           { 
            ThreadId = thread.threadid, 
            Title = thread.Title, 
            description = thread.desc, 
            platformName = platform.platformName 
           }).ToList();       
    } 
} 

例如:然後我重寫代碼通過發送單獨的平臺ID使用迭代來檢索記錄,以避免緩慢的執行時間:每個:但是這也需要更多的時間少上一個。但效率不高。

例如:

public function(string[] platformId) 
{ 
    foreach(platid in platformId) 
    { 
     using (SupportEntity support = new SupportEntity()) 
     {  
      var Threads = (from thread in support.ForumThread 
          from platform in support.Platforms 
          where platid == thread.Platformid && 
           platform.PlatformId == platid 
          select new 
          { 
           ThreadId = thread.threadid, 
           Title = thread.Title, 
           description = thread.desc, 
           platformName = platform.platformName 
          }).ToList(); 

      ThreadCollection.AddRange(threads);      
     } 
    }  
} 

能否請你建議,如何獲得寫單查詢檢索記錄在一個單一的查詢更有效?

回答

3

要將一堆Id傳遞給查詢以與數據庫中的Id進行比較,通常您會使用調用Contains而不是循環它(這將導致循環的每次迭代都會有另一個查詢,並且將會很慢)。我不能完全收集,將如何融入你的實體,因爲我不知道該using (SupportEntity support = new SupportEntity())部分如何工作,但這裏有一個簡單的例子:

public IEnumerable<Car> GetCarsMatchingIds(IEnumerable<int> carIds) 
{ 
    using(var dealershipContext = new DealershipContext()) 
    { 
     return dealershipContext.Cars.Where(c => carIds.Contains(c.Id)); 
    } 
} 
1

首先,什麼豹貓說:Contains將轉化直接進入SQL中的等效測試(如where id in (1, 2, 3)),並且效率最高。其次,Platform實體應該具有相關線程的導航屬性。你應該能夠減少查詢這樣的事情:

from platform in support.Platforms 
where platids.Contains(platform.id) 
from thread in platform.ForumThreads 
select ... 
+0

感謝您的建議。它的工作效率更高。 – Anandh

+0

你能解釋爲什麼Linq查詢過程在執行本地集合時使用sql server集合[table]會變慢嗎? – Anandh

+0

@Anandh嘗試使用ObjectQuery.ToTraceString比較生成的SQL:'((ObjectQuery)(from ...))。ToTraceString()' – nmclean

相關問題