6

여기에 빠른 질문이 있습니다. 먼저 EF6 모델을 사용하십시오.오류 : 엔티티에 LINQ가 메서드를 인식하지 못합니다. DataLength

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); 

첫 번째 어설 션이 성공하므로 결과 2와 결과 3이 실행될 때 왜 다음 예외가 발생합니까?

An exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll but was not handled in user code

Additional information: LINQ to Entities does not recognize the method 'System.Nullable`1[System.Int32] DataLength(Byte[])' method, and this method cannot be translated into a store expression.

다른 어설 션이 성공하려면 어떤 방법이 있습니까?

+0

내에 위치한

System.Data.Entity.SqlServer.SqlFunctions.DataLength 

를 사용한다 그것의 지금은 거의 일주일이었다. 나는이 질문이 얼마나 오래 되어도 제안을 듣는 데 관심이 있습니다. –

답변

8

대답은 잘못된 기능을 사용하고있는 것으로 나타났습니다.

대신

System.Data.Objects.SqlClient.SqlFunctions.DataLength 

의 내가 EntityFramework.SqlServer.dll

+0

나는이 네임 스페이스 차이점을 지적 해 주셔서 네임 스페이스 유사성에 속았습니다. ! 아마도 두 시간 만 절약했을거야! – Paccc

+0

적절한 라이브러리를 가져 오는 경우 SqlFunctions.DataLength로 단순화 할 수도 있습니다. – Joe

0

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 절을 실행하기 전에이를 목록에 열거하면 EF가 db 쿼리의 일부로 실행하려고하는 대신 CLR 개체에서 Where 조건이 실행됩니다.

+0

에 따르면 http://stackoverflow.com/questions/19496301/how-to-get-a-byte-array-length-using-linq-to-entities 심지어 msdn에 따르면이 기능은 데이터베이스의 함수 "를 참조하십시오. DataLength는 EDM 함수이므로 SQL 함수로 변환해야하므로 http://msdn.microsoft.com/en-us/library/dd466174(v=vs.110).aspx 을 참조하십시오. 귀하의 대답은 전체 데이터 세트가 메모리에로드 된 다음 필터링된다는 것을 의미합니다. 단일 필터링 쿼리로 실행해야합니다. 도 참조하십시오 : http://www.nilzorblog.com/2011/08/linq2ef-pitfall-using-length-property.html –

관련 문제