2015-02-06 18 views
7

nHibernate kullanarak LINQ sorgusuyla bazı kodlarım var ve çalıştırıldığında, bir PartialEvaluationExceptionExpression atar. Bu tam olarak ne anlama geliyor ve bu konuda ne yapabilirim?PartialEvaluationExceptionExpression nedir ve nasıl düzeltebilirim?

SomeIqueryableNhibernateObject 
.Where(x=>... 
some expression 
&& !Model.date.HasValue ? true : (x.fooDate.Date == Model.date.Value.Date) 
&& some expresion 

Modeli olduğunda:

public class Filter 
{ 
    DateTime? date; 
} 

İstisna üçlü operatörün yanlış yolu kaynaklanır:

x.fooDate != null && Model.date.HasValue && x.fooDate.Date == Model.date.Value.Date 
:

x.fooDate.Date == Model.date.Value.Date 

Ben bunu değiştirmek bile

hala istisnayı atar.

+0

Bu istisnanın ne anlama geldiğini görmek için “PartialEvaluationExceptionExpression” belgesine baktınız mı? – Servy

+0

Şaşırdım ama istisna hakkında net bir bilgi bulamadım. Örneğin, bu: http://www.nudoq.org/#!/Packages/NHibernate/NHibernate/PartialEvaluationExceptionExpression - benim görüşüme göre herhangi bir yararlı bilgi sağlamaz. – Landeeyo

+0

Benim için ilk Google sonucu şuydu: http://www.nudoq.org/#!/Packages/Remotion.Linq/Remotion.Linq/PartialEvaluationExceptionExpression – Servy

cevap

7

null nesnesinin değerini alan kod çalıştırıyorsunuz ve böylece atıyor. Sorgu sağlayıcı, bu sorgunun veritabanını çalıştırabileceği bir dosyaya dönüştürmeye çalıştığında, Model.date.Value.Date değerini kendi değerine çözmesi gerekir, böylece değer sorguda kullanılabilir. Değer olmadığından kod kırılır.

Tabii ki çözüm, sorgunun kendisinde bunun gibi bir denetleme yapmamaktır. Bu çeki ekleyerek gerekip gerekmediğini ya da olmasın, sorgunun bağlamı dışında, belirleyin ve gerekirse daha sonra sadece ekleyin:

İşte
var query = CreateInitialQuery(); 
if(Model.date.HasValue) 
    query = query.Where(x => x.fooDate.Date == Model.date.Value.Date); 

sadece hiç bir değer verilir sorgu sağlayıcı aslında orada değerlendirmek değerlendirilecek bir değerdir.

+1

Yazdığınız benim için en önemli şey çeviri ile ilgili bölümdür SQL'e LINQ ifadesi. Çok fazla "zorunluluk" düşünüyordum, bu yüzden eğer koşul doğruysa yanlış yolun neden yürütüldüğüne şaşırdım. Dürüst olmak gerekirse, sorunu daha önce aynı şekilde çözdüm, yazdığınız gibi ayıklayarak ama neden hala işe yaramadığını fark etmedim. Şimdi sebebini anlıyorum. Çok teşekkür ederim. – Landeeyo