错误:LINQ to Entities 无法识别方法 DataLength
Posted
技术标签:
【中文标题】错误:LINQ to Entities 无法识别方法 DataLength【英文标题】:error: LINQ to Entities does not recognize the method DataLength 【发布时间】:2014-11-16 00:18:53 【问题描述】:我有一个简短的问题。 首先使用 EF6 模型。
var db = new MyEntities(GetEntityConnectionString());
ObjectContext objectContext = ((IObjectContextAdapter)db).ObjectContext;
ObjectSet<DOCUMENT> objectSet = objectContext.CreateObjectSet<DOCUMENT>();
var results = objectSet.Where("SqlServer.DATALENGTH(it.BINARYCONTENT)>50000");
Assert.IsTrue(results.ToList().Count == 9);
var results2 = objectSet.Where(doc=>System.Data.Objects.SqlClient.SqlFunctions.DataLength( doc.BINARYCONTENT)>50000);
Assert.IsTrue(results2.ToList().Count == 9);
var results3 = db.DOCUMENTS.Where(doc => System.Data.Objects.SqlClient.SqlFunctions.DataLength(doc.BINARYCONTENT) > 50000);
Assert.IsTrue(results3.ToList().Count == 9);
第一个assert成功了,为什么执行results2和results 3时会出现如下异常?
EntityFramework.SqlServer.dll 中出现“System.NotSupportedException”类型的异常,但未在用户代码中处理
附加信息:LINQ to Entities 无法识别方法 'System.Nullable`1[System.Int32] DataLength(Byte[])' 方法,并且此方法无法转换为存储表达式。
有没有办法让其他断言成功?
【问题讨论】:
现在已经快一周了。不管这个问题有多老,我仍然有兴趣听取建议。 【参考方案1】:原来答案是我用错了函数。
而不是
System.Data.Objects.SqlClient.SqlFunctions.DataLength
我应该使用
System.Data.Entity.SqlServer.SqlFunctions.DataLength
位于 EntityFramework.SqlServer.dll 中
【讨论】:
我也被命名空间的相似性所欺骗,感谢您指出这种微妙的差异!可能为我节省了几个小时! 如果导入了正确的库,这也可以简化为 SqlFunctions.DataLength。 我正在使用 System.Data.Entity.SqlServer.SqlFunctions.DataLength 并且仍然收到相同的错误...【参考方案2】:EF 不知道如何将 C# 方法转换为 SQL 代码。
如果你改成这个,它应该可以工作: (注意我添加了“.ToList()”)
var results2 = objectSet.ToList().Where(doc=>System.Data.Objects.SqlClient.SqlFunctions.DataLength( doc.BINARYCONTENT)>50000);
Assert.IsTrue(results2.ToList().Count == 9);
var results3 = db.DOCUMENTS.ToList().Where(doc => System.Data.Objects.SqlClient.SqlFunctions.DataLength(doc.BINARYCONTENT) > 50000);
Assert.IsTrue(results3.ToList().Count == 9);
当您将变量声明为 EF Query 时,它直到第一次被枚举时才真正运行。在对其运行 where 子句之前将其枚举到列表会导致您的 Where 条件在 CLR 对象上运行,而不是 EF 尝试作为 db 查询的一部分运行。
【讨论】:
不是根据***.com/questions/19496301/… 甚至 msdn 说“这个函数被转换为数据库中的相应函数”参见msdn.microsoft.com/en-us/library/dd466174(v=vs.110).aspx 因为 DataLength 是一个 EDM 函数,它应该转换为一个 SQL 函数。您的回答意味着整个数据集将被加载到内存中,然后在那里过滤。这应该作为单个过滤查询执行。另见:nilzorblog.com/2011/08/…以上是关于错误:LINQ to Entities 无法识别方法 DataLength的主要内容,如果未能解决你的问题,请参考以下文章
我如何修复“LINQ to Entities无法识别方法”错误
c#,LINQ to Entities 无法识别方法'Int32 [重复]
为啥 LINQ to Entities 无法识别方法 'System.String ToString()?
LINQ to Entities 无法识别方法“System.String ToString(Int32)”
LINQ to Entities 无法识别方法“System.String StringConvert(System.Nullable`1[System.Double])