2014-10-10 168 views
1

在這樣的代碼中,用於根據條件檢查對象的存在, 如何在檢查計數後處理查詢集合。處理LINQ查詢的結果

var query = from p in someContext 
      where (p.Name == Name && p.Status == true) 
      select p; 

if (query.Count() > 0) 
    return true; 
else 
    return false; 

這是一個簡單的場景,但可能會出現查詢可能導致巨大集合的情況。 所以我的問題是,在需要檢查是否存在對象的情況下,如何編寫此查詢,以便在完成對count的檢查後結果集合不在內存中。

問候。

+2

不是一個真正的答案,但你可以通過這樣 VAR查詢在someContext 其中減少查詢的大小=從P( p.Name == Name && p.Status == true) select p.Name; 並用query.Any()替換query.Count() – ojf 2014-10-10 11:25:33

+2

從函數'query'返回後,超出範圍並且垃圾回收器將爲您完成工作。 – Fratyx 2014-10-10 11:27:32

+1

你在使用什麼查詢提供程序?如果您使用的是ORM,則此查詢不需要創建任何集合。如果它是內存中的集合,您應該可以清除它。 – Lee 2014-10-10 11:27:37

回答

2

LINQ擴展方法.Count()實際執行的操作取決於所使用的查詢提供程序。在實體框架的情況下(假定您正在使用的是),將生成一個SQL查詢,它將返回記錄數,而不是記錄本身。因此,您不必擔心處理大量收集。

示例代碼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     using(var db = new TestContext()) 
     { 
      db.Database.Log += Console.WriteLine; 

      var query = from mfg in db.Manufacturers 
         where mfg.Name.Contains("Inc.") 
         select mfg; 

      var count = query.Count(); 
     } 

     Console.ReadLine(); 
    } 
} 

生成SQL:

select 
    [GroupBy1].[A1] AS [C1] 
    FROM (SELECT 
     COUNT(1) AS [A1] 
     FROM [dbo].Manufacturers] AS [Extent1] 
     WHERE [Extent1].[Name] LIKE N'%Inc.%' 
    ) AS [GroupBy1]