LINQ to Entities StringConvert(double)'无法转换为将int转换为string

Nes*_*tor 4 linq-to-entities entity-framework-4 sql-server-ce-4

问题

需要使用EF4 + SQL CE4将int转换为字符串.使用SqlFunctions.StringConvert(double)的推荐选项仍然给我错误.

选项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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

选项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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在显示以下错误:

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.
Run Code Online (Sandbox Code Playgroud)

选项3(针对非常具体的情况).然后anoter post使用Dictionary显示一个智能解决方案,最终有效:

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但只适用于简单的对值(键,值).有人可以帮助我解决另一个解决方案或我做错了选项2吗?

我希望微软能够在推动我们从已经稳定且更加成熟的L2S转移之前尽快使EF成为现实.我实际上只是因为想要使用SQL CE而使用EF4,否则我会继续使用L2S.

Lad*_*nka 5

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

顺便说一句.第三个选项也不是解决方案,因为它会选择整个客户表到内存并在此之后使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)