Entity framework 4 无法将LINQ转换为实体StringConvert(double)“”转换为将int转换为字符串

Entity framework 4 无法将LINQ转换为实体StringConvert(double)“”转换为将int转换为字符串,entity-framework-4,linq-to-entities,sql-server-ce-4,Entity Framework 4,Linq To Entities,Sql Server Ce 4,问题 需要使用EF4+SQLCE4将int转换为字符串。建议使用SqlFunctions.StringConvertdouble的选项仍然会给我带来错误 备选案文1原件。这给了我一个错误: public static IEnumerable<SelectListItem> xxGetCustomerList() { using (DatabaseEntities db = new DatabaseEntities()) {

问题

需要使用EF4+SQLCE4将int转换为字符串。建议使用SqlFunctions.StringConvertdouble的选项仍然会给我带来错误

备选案文1原件。这给了我一个错误:

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();
        }
    }
选项3适用于非常具体的情况。然后,另一篇文章展示了一个使用字典的智能解决方案,该解决方案最终有效:

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。

EF在上层独立于数据库,但处理linq查询到SQL的转换的部分始终依赖于数据库,SqlFunctions依赖于SQL Server Provider,但您使用的是SQL Server CE Provider,它无法从SqlFunctions类转换函数

顺便说一句,第三个选项也不是一个解决方案,因为它将选择整个customer表来存储,然后使用linqto对象。您应该使用以下选项:

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();
    }
}

下面是我现在针对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部分

可能是由于Im使用SQL CE造成的?而不是SQL或SQL Express?我读过另一篇文章,在使用MySQL时也有同样的问题。EF4应该是独立于数据库的,不是吗?这是有道理的,我知道CE是用于简单的应用程序的,但这样使用它还是很痛苦的。谢谢我将把你的问题标记为一个解决方案,并把我的最后一个工作版本。
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();
    }
}
    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();
        }
    }