2011-06-15 89 views
1

在linq查詢中有一個'where'子句,我必須將一個int轉換爲一個字符串,我曾試着在SO中讀過類似的遭遇,但我仍然在應用解決方案時遇到困難我的方法。這是將拋出'System.Web.HttpUnhandledException'錯誤的行,任何幫助表示讚賞:在Linq中將int轉換爲字符串where子句

(!p.ProductID = NULL & & p.ProductID.ToString()包含(S)):

public void search(string s) 
    { 
     CommerceEntities db = new CommerceEntities(); 

      var products = from p in db.Products 

          where (p.ModelName != null && p.ModelName.Contains(s)) 
          || (p.ProductID != null && p.ProductID.ToString().Contains(s)) 
          || (p.ModelNumber != null && p.ModelNumber.Contains(s)) 
          || (p.Description != null && p.Description.Contains(s)) 

          select new 
          { 
           // Display the items 
           ProductID = p.ProductID, 
           ProductImage = p.ProductImage, 
           UnitCost = p.UnitCost 
          }; 

      ListView_Products.DataSourceID = null; 
      ListView_Products.DataSource = products; 

    } 
+0

也許你需要使用'SqlFunctions.StringConvert' – V4Vendetta 2011-06-15 10:44:15

+0

只是一個問題,你想投一個int一個字符串,然後看看鑄造字符串包含字符串?這隻會工作,如果S是一個int,以及?爲什麼不傳遞一個int而不是一個字符串 – MBen 2011-06-15 10:46:14

回答

6

在EF,沒有超載對於int,所以你需要轉換爲雙或十進制你必須使用SqlFunctions.StringConvert

像這樣:

 p.ProductID != null && SqlFunctions.StringConvert((double)p.ProductID).Contains(s) 
+0

感謝這個工程,但奇怪的是它沒有int超載。 – k80sg 2011-06-15 11:24:33

+0

不客氣!是的,這很奇怪。 – asma 2011-06-15 11:32:52

-1

不能使用在實體框架LINQ查詢中的ToString()方法。

0

這是拋出異常,因爲在第一行結束時,你關閉了where方法。你缺少一個(即基團的那些行在一起。

where ((p.ModelName != null && p.ModelName.Contains(s)) || 
     (p.ProductID != null && p.ProductID.ToString().Contains(s)) || 
     (p.ModelNumber != null && p.ModelNumber.Contains(s)) || 
     (p.Description != null && p.Description.Contains(s))) 
0

如果你正在使用LINQ到實體,你不能使用C#方法查詢表達式中。 它將如果是LINQ到SQL工作。

0

初始化一個整型變量轉換您的字符串s的比使用
p.ProductID ==(INTVAL))

意味着你的代碼會是這樣

public void search(string s) 
{ 
    CommerceEntities db = new CommerceEntities(); 
    int val = Convert.ToInt32(s); 
    IQueryable<Product> product = db.Products ; 
     var products = from p in db.Products 

         where (p.ModelName != null && p.ModelName.Contains(s)) 
         || (p.ProductID != null && p.ProductID == val) 
         || (p.ModelNumber != null && p.ModelNumber.Contains(s)) 
         || (p.Description != null && p.Description.Contains(s)) 

         select new 
         { 
          // Display the items 
          ProductID = p.ProductID, 
          ProductImage = p.ProductImage, 
          UnitCost = p.UnitCost 
         }; 

     ListView_Products.DataSourceID = null; 
     ListView_Products.DataSource = products; 

} 
+0

這我相信不會很理想,因爲用戶必須鍵入確切的ProductID字符才能返回任何搜索結果,因爲「==」 – k80sg 2011-06-15 11:21:54

+0

然後,必須從產品ID檢查中刪除ToString(),因爲它不受支持Linq。 – Syeda 2011-06-15 11:38:45

0

一個血統的解決方法仍評估查詢在DB如下:

Convert.ToString(p.ProductID).Contains(s)