错误:LINQ to Entities无法识别DataLength方法

时间:2014-09-22 05:31:35

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

我在这里有一个简单的问题。 首先使用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);

第一个断言成功,那么为什么在执行results2和result3时会出现以下异常?

  

类型&#39; System.NotSupportedException&#39;的例外情况发生在EntityFramework.SqlServer.dll中但未在用户代码中处理

     

附加信息:LINQ to Entities无法识别方法&#39; System.Nullable`1 [System.Int32] DataLength(Byte [])&#39;方法,并且此方法无法转换为商店表达式。

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

2 个答案:

答案 0 :(得分:8)

事实证明,答案是我使用了错误的功能。

而不是

System.Data.Objects.SqlClient.SqlFunctions.DataLength

我应该使用

System.Data.Entity.SqlServer.SqlFunctions.DataLength

位于EntityFramework.SqlServer.dll

答案 1 :(得分:-1)

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查询时,它实际上不会在第一次枚举时运行。在运行where子句之前将其枚举到列表会导致在CLR对象上运行Where条件而不是尝试作为db查询的一部分运行的EF。