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.
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)
| 归档时间: |
|
| 查看次数: |
6724 次 |
| 最近记录: |