错误: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])

LINQ to Entities 无法识别方法“布尔包含 [Int32]