【问题标题】:error: LINQ to Entities does not recognize the method DataLength错误:LINQ to Entities 无法识别方法 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[])' 方法,并且此方法无法转换为存储表达式。

有没有办法让其他断言成功?

【问题讨论】:

  • 现在已经快一周了。不管这个问题有多老,我仍然有兴趣听取建议。

标签: c# linq entity-framework linq-to-entities entity-framework-6


【解决方案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 查询的一部分运行。

【讨论】:

猜你喜欢
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 2012-04-03
  • 2021-11-06
相关资源
最近更新 更多