Rod*_*dri 11 c# linq linq-to-entities entity-framework
我有下面的代码:
using (DBContext context = new DBContext())
{
    myCollection = context.Items.Where(i => i.Type == 1).OrderBy(k => k.Name).Select(w => new
    {
        Alias = w.Name + string.Format("{0}", w.Id),
        Name = w.Name                        
    }).ToArray();
}
在运行时,我尝试连接字符串并尝试con转换整数w.Id为字符串时出错.
错误说:
Linq to实体无法识别方法string.Format
也不支持串联符号'+'.
我通过引入AsEnumerable解决了这个问题:
using (DBContext context = new DBContext())
{
    myCollection = context.Items.AsEnumerable().Where(i => i.Type == 1).OrderBy(k => k.Name).Select(w => new
    {
        Alias = w.Name + string.Format("{0}", w.Id),
        Name = w.Name                        
    }).ToArray();
}
但我想知道这是否是最佳解决方案,或者还有另一种方式更适合这样做.想法?
Ser*_*kiy 15
EF无法转换String.Format为SQL,但它处理字符串连接没有问题.使用SqlFunctions.StringConvert而不是String.Format在服务器端将数字转换为字符串:
Select(w => new {
    Alias = w.Name + SqlFunctions.StringConvert((double)w.Id),
    Name = w.Name                        
})
它产生类似的东西
SELECT 
[Extent1].[Name] + STR( CAST( [Extent1].[Id] AS float)) AS [C1], 
[Extent1].[Name] AS [Name]
FROM [dbo].[Items] AS [Extent1]
更新:因此您正在使用不支持此转换的EF提供程序(SQL CE提供程序无法将此查询转换为SQL)您只剩下一个选项 - 将计算移动到客户端,就像您已经完成的那样.
Est*_*din 15
您的代码的一个优化是AsEnumerable()在Where方法之后使用.如果不是,则从存储返回每个实体,并使用LINQ to Objects检查整个表.通过对代码的这种简单修改,您可以在sql上运行where子句并从存储中检索较少的记录.一般规则是首先放置由LINQ提供程序实现的任何查询子句.
using (DBContext context = new DBContext())
{
    myCollection = context.Items.Where(i => i.Type == 1)
       .AsEnumerable().OrderBy(k => k.Name).Select(w => new
        {
            Alias = w.Name + string.Format("{0}", w.Id),
            Name = w.Name                        
        }).ToArray();
}
| 归档时间: | 
 | 
| 查看次数: | 18564 次 | 
| 最近记录: |