Err*_*Efe 126 c# mysql sql linq
我正在将一些东西从一个mysql服务器迁移到一个sql server但我无法弄清楚如何使这个代码工作:
using (var context = new Context())
{
    ...
    foreach (var item in collection)
    {
        IQueryable<entity> pages = from p in context.pages
                                   where  p.Serial == item.Key.ToString()
                                   select p;
        foreach (var page in pages)
        {
            DataManager.AddPageToDocument(page, item.Value);
        }
    }
    Console.WriteLine("Done!");
    Console.Read();
}
当它进入第二个时foreach (var page in pages)它抛出一个异常说:
LINQ to Entities无法识别方法'System.String ToString()'方法,并且此方法无法转换为存储表达式.
谁知道为什么会这样?
Jos*_*osh 133
只需将字符串保存到临时变量,然后在表达式中使用它:
var strItem = item.Key.ToString();
IQueryable<entity> pages = from p in context.pages
                           where  p.Serial == strItem
                           select p;
问题出现是因为ToString()没有真正执行,它被转换为MethodGroup然后解析并转换为SQL.由于没有ToString()等价物,表达式失败.
请确保您还查看了Alex关于SqlFunctions稍后添加的助手类的答案.在许多情况下,它可以消除对临时变量的需求.
Ale*_*lex 66
正如其他人已经回答的那样,这会因为.ToString在进入数据库的途中无法转换为相关的SQL而中断.
但是,Microsoft提供了SqlFunctions类,它是可以在这种情况下使用的方法的集合.
对于这种情况,你在这里寻找的是SqlFunctions.StringConvert:
from p in context.pages
where  p.Serial == SqlFunctions.StringConvert((double)item.Key.Id)
select p;
当具有临时变量的解决方案因任何原因而不可取时是好的.
与SqlFunctions类似,您还拥有EntityFunctions(由DbFunctions废弃的EF6),它提供了一组不同的函数,这些函数也是数据源不可知的(不限于例如SQL).
Jus*_*ner 23
问题是您在LINQ to Entities查询中调用ToString.这意味着解析器正在尝试将ToString调用转换为其等效的SQL(这是不可能的......因此异常).
您所要做的就是将ToString调用移到单独的行:
var keyString = item.Key.ToString();
var pages = from p in context.entities
            where p.Serial == keyString
            select p;
小智 10
有类似的问题.通过调用实体集合上的ToList()并查询列表来解决它.如果集合很小,这是一个选项.
IQueryable<entity> pages = context.pages.ToList().Where(p=>p.serial == item.Key.ToString())
希望这可以帮助.
像这样改变它应该工作:
var key = item.Key.ToString();
IQueryable<entity> pages = from p in context.pages
                           where  p.Serial == key
                           select p;
在LINQ查询被声明的行中没有抛出异常的原因foreach是在延迟执行功能的行中,即在您尝试访问结果之前不执行LINQ查询.而这种情况发生在foreach而不是更早.
将表强制转换为Enumerable,然后使用ToString()内部的方法调用LINQ方法:
    var example = contex.table_name.AsEnumerable()
.Select(x => new {Date = x.date.ToString("M/d/yyyy")...)
但是,在调用AsEnumerable或ToList方法时要小心,因为在此方法之前,您将要求所有实体提供所有数据。在上面的例子中,我table_name通过一个请求读取了所有行。
| 归档时间: | 
 | 
| 查看次数: | 177720 次 | 
| 最近记录: |