6

tanımıyor. İlk önce EF6 modelini kullanarak .hatası: varlıkları için LINQ burada hızlı bir sorum var metod veri boyu

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

ilk assert başarılı, bu yüzden şu istisna olsun results2 ve 3 sonuçları neden yürütülür?

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.

Diğer önerilerin başarılı olması için herhangi bir yolu var mı?

+0

içinde yer

System.Data.Entity.SqlServer.SqlFunctions.DataLength 

kullanarak olmalıdır O var artık neredeyse bir hafta oldu. Bu sorunun ne kadar eski olursa olsun, önerileri hala duymak istiyorum. –

cevap

8

Cevabın yanlış işlevini kullanarak olmam çıkıyor.

yerine

System.Data.Objects.SqlClient.SqlFunctions.DataLength 

I EntityFramework.SqlServer.dll

+0

İsim alanlarının benzerliğinden de kandırıldım, bu alt farkı fark ettiğiniz için teşekkürler ! Muhtemelen birkaç saatimi kurtardı! – Paccc

+0

Bu, uygun kitaplık içe aktarılırsa SqlFunctions.DataLength için de basitleştirilebilir. – Joe

0

EF SQL koduna bir C# yöntemi dönüştürmek için nasıl bilmiyor.

şuna değiştirirseniz çalışması gerekir: (ekledim unutmayın ".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); 

sen aslında ilk dek koştum olmayan bir EF Query olarak bir değişkeni bildirmek zaman numaralandırılır. Üzerinde where yan tümcesini çalıştırmadan önce bir listeye numaralandırmak, durumunuzun, Db sorgusunun bir parçası olarak çalışmayı denemek yerine, EF yerine CLR nesnelerinde çalıştırılmasına neden olur.

+0

http://stackoverflow.com/questions/19496301/how-to-get-a-byte-array-length-using-linq-to-entities göre değil bile msdn diyor "Bu fonksiyon, bir karşılık gelen çevrilmiştir "veritabanında fonksiyon veri boyu beri bir SQL işlevi çevirmek gereken bir EDM fonksiyonudur http://msdn.microsoft.com/en-us/library/dd466174(v=vs.110).aspx görüyoruz. Cevabınız veri seti daha sonra orada filtrelenmiş belleğe yüklenecek anlamına gelir. Bu, tek bir filtreleme sorgusu olarak yürütülmelidir. ayrıca bkz .: http://www.nilzorblog.com/2011/08/linq2ef-pitfall-using-length-property.html –

İlgili konular