2011-04-24 96 views
4

問題LINQ到實體StringConvert(雙)​​」不能轉換爲INT轉換爲字符串

需要使用EF4 + SQL CE4爲INT轉換爲字符串。建議使用SqlFunctions.StringConvert(double)的選項仍然會給我帶來錯誤。

選項1(original)。這給了我錯誤:

public static IEnumerable<SelectListItem> xxGetCustomerList() 
    { 
     using (DatabaseEntities db = new DatabaseEntities()) 
     { 
      var list = from l in db.Customers 
         orderby l.CompanyName 
         select new SelectListItem { Value = l.CustomerID.ToString(), Text = l.CompanyName }; 
      return list.ToList(); 
     } 
    } 

選項2(最推薦)。然後儘可能多的帖子表明,我從圖書館System.Data.Objects.SqlClient使用的SqlFunctions.StringConvert()函數:

public static IEnumerable<SelectListItem> GetCustomerList() 
    { 
     using (DatabaseEntities db = new DatabaseEntities()) 
     { 
      var list = from l in db.Customers 
         orderby l.CompanyName 
         select new SelectListItem { Value = SqlFunctions.StringConvert((double)l.CustomerID), Text = l.CompanyName }; 
      return list.ToList(); 
     } 
    } 

現在顯示如下錯誤:

The specified method 'System.String StringConvert(System.Nullable`1[System.Double])' on the type 'System.Data.Objects.SqlClient.SqlFunctions' cannot be translated into a LINQ to Entities store expression. 

選項3 (非常具體的情況)。然後anoter後顯示使用字典一個聰明的解決方案,最終的作品:

public static IEnumerable<SelectListItem> xGetCustomerList() 
    { 
     using (DatabaseEntities db = new DatabaseEntities()) 
     { 
      var customers = db.Customers.ToDictionary(k => k.CustomerID, k => k.CompanyName); 
      var list = from l in customers 
         orderby l.Value 
         select new SelectListItem { Value = l.Key.ToString(), Text = l.Value }; 
      return list.ToList(); 
     } 
    } 

但是,只有簡單的對值(鍵,值)的工作。有人可以幫助我解決另一個問題,或者我在做什麼錯誤的選項2?

我希望微軟在推動我們從已經穩定和更成熟的L2S之前很快就會推出EF。我實際上使用EF4只是因爲想要使用SQL CE,否則我會留在L2S中。

+0

也許是由於我使用SQL CE?而不是SQL或SQL Express?我使用MySQL閱讀其他有相同問題的文章。 EF4應該是數據庫獨立的,不應該嗎? – Nestor 2011-04-24 15:28:05

回答

5

EF在上層與數據庫無關,但處理將linq查詢轉換爲SQL的部分始終取決於數據庫,並且SqlFunctions依賴於SQL Server提供程序,但是您使用的SQL Server CE提供程序無法將函數從SqlFunctions類。

Btw。第三個選項也不是解決方案,因爲它將選擇整個客戶表到內存,然後使用linq-to-objects。你應該使用這個:

public static IEnumerable<SelectListItem> xxGetCustomerList() 
{ 
    using (DatabaseEntities db = new DatabaseEntities()) 
    { 
     // Linq to entities query 
     var query = from l in db.Customers 
        orderby l.CompanyName 
        select new { l.CustomerID, l.CompanyName }; 

     // Result of linq to entities transformed by linq to objects 
     return query.AsEnumerable() 
        .Select(x => new SelectListItem 
         { 
          Value = x.CustomerID.ToString(), 
          Test = x.CompanyName 
         }).ToList(); 
    } 
} 
+0

這很有道理,而且我明白CE只適用於簡單的應用程序,但仍然很難以這種方式使用它。謝謝。我會將您的問題標記爲解決方案並放入最後的工作版本。 – Nestor 2011-04-24 16:30:05

-1

下面是一個簡化版本,我現在使用(具體爲SQL CE):

public static IEnumerable<SelectListItem> GetBlogCategoryList() 
    { 
     using (SiteDataContext db = new SiteDataContext()) 
     { 
      var list = from l in db.BlogCategories.AsEnumerable() 
         orderby l.CategoryName 
         select new SelectListItem { Value = l.CategoryID.ToString(), Text = l.CategoryName }; 

      return list.ToList(); 
     } 
    } 

注意db.BlogCategories.AsEnumerable()部分