我有个简短的问题要问。首先使用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和结果3时,为什么要获得以下异常?
“System.NotSupportedException”类型的异常发生在EntityFramework.SqlServer.dll中,但未在用户代码中处理 附加信息: LINQ不识别方法'System.Nullable`1System.Int32 DataLength(Byte[])‘方法,该方法无法转换为存储表达式。
有什么办法让其他人成功吗?
发布于 2014-10-01 23:27:15
结果,答案是我使用了错误的函数。
而不是
System.Data.Objects.SqlClient.SqlFunctions.DataLength我应该用
System.Data.Entity.SqlServer.SqlFunctions.DataLength位于EntityFramework.SqlServer.dll内
发布于 2014-09-22 16:57:52
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子句之前,将其枚举到列表中,将导致您的Where条件在CLR对象上运行,而不是EF试图作为db查询的一部分运行。
https://stackoverflow.com/questions/25967201
复制相似问题