2013-03-01 77 views
0

我正在使用下面的查詢來獲取所有具有SubCategoryName == subCatName的記錄,並且我想返回所有ProductID的記錄作爲ints的列表。問題是當我的代碼運行時,它只返回1個int(記錄)而不是全部。我怎樣才能讓它返回所有有這個subCatName的記錄?它返回一個count = 1,容量爲4.所以它是一個int[4],但只有第一個[0] =實際產品ID,其餘的返回零?Linq查詢返回1個項目而不是全部

public List<int> GetPRodSubCats(string subCatName) 
    { 
     var _db = new ProductContext(); 

     if (subCatName != null) 
     { 
      var query = _db.ProductSubCat 
          .Where(x => x.SubCategory.SubCategoryName == subCatName) 
          .Select(p => p.ProductID); 

      return query.ToList<int>(); 
     } 
     return null; 
    } 
+9

你的代碼看起來不錯。你是否100%確定你的查詢不只是返回1行? – 2013-03-01 16:25:43

+0

您確定您有多個結果可以返回嗎?嘗試使用Linqpad測試的東西(http://www.linqpad.net/) – 2013-03-01 16:26:08

+1

請確保您的數據庫有多個記錄該子類別:) – dasblinkenlight 2013-03-01 16:26:13

回答

2

正如Daniel已經提到的那樣,代碼應該可以工作。但是,也許你期望它不區分大小寫或忽略空格。所以這是更寬容:

subCatName = subCatName.Trim(); 
List<int> productIDs = _db.ProductSubCat 
    .Where(x => String.Equals(x.SubCategory.SubCategoryName.Trim(), subCatName, StringComparison.OrdinalIgnoreCase)) 
    .Select(p => p.ProductID) 
    .ToList(); 
+0

類名「Context」和變量名「_db」表示他正在使用實體框架。在這種情況下,您的代碼將無法工作,因爲它無法轉換爲SQL語句。 – JustAnotherUserYouMayKnow 2013-03-01 16:33:42

+0

@JustAnotherUserYouMayKnow:以某種方式忽略了它。 'String.Equals'另一方面應該工作,因爲這個答案建議:http://stackoverflow.com/a/841342/284240 – 2013-03-01 16:39:49

+0

這將導致一個ArgumentException「爲調用方法提供的參數不正確的數量」布爾等於( System.String,System.String,System.StringComparison)'「枚舉查詢時。 Stans回答了工作,同時在「.ToLower()」之前或之後添加了「.Trim()」。這是用EntityFramework 4測試的。你鏈接的stackoverflow答案是指linq-to-sql,而不是linq-to-entities。這完全取決於他實際使用的框架。 ;-) – JustAnotherUserYouMayKnow 2013-03-01 16:54:58

2

這似乎更像是一個預期的行爲。你怎麼知道你不僅有一條滿足Where謂詞的記錄。

您的代碼是正確的,但是您可能需要規範化比較。

x => x.SubCategory.SubCategoryName == subCatName

使用特定的情況下,例如:

x => x.SubCategory.SubCategoryName.ToLower() == subCatName.ToLower()

您也可以考慮微調。