2012-10-25 14 views
6

: -Belirli bir ifadenin bir SQL veritabanına * bağlanmadan SQL * 'ye dönüştürülüp dönüştürülemeyeceğini test etmek mümkün mü? Örneğin

// This one will be converted to SQL no problem 
Expression<Func<Foo, bool>> predicate = x => x.Name = "Foo"; 

// This one will throw a NotSupportedException because the QueryProvider 
// doesn't support reference comparisons 
Expression<Func<Foo, bool>> predicate = x => x == someOtherFoo; 

// This one doesn't work because the query provider can't 
// handle IsAwesome() 
Expression<Func<Foo, bool>> predicate = x => x.IsAwesome(); 

Ben ideal veritabanından izole otomatik testte, çalışma zamanı önce bu test etmek için bir yol arıyorum.

Kendi QueryProvider'ımı nasıl hazırlayacağımı bulmaya çalışırken MSDN ile trol yapmak için biraz zaman harcadım, ancak Google-fu'm bugün beni başarısız gösteriyor gibi görünüyor.

Şimdiden teşekkürler!

cevap

4

Bunu yapmak için bir modele ihtiyacınız var, ancak bir veritabanına ihtiyacınız yok. Modeli bir EDMX olarak oluşturabilirsiniz, ancak Kod İlkini kullanmanız daha olasıdır. Kod İlk modelinin oluşturulmasının veya kullanılmasının bir veritabanı bağlantısına ihtiyaç duymadığından emin olmak için Kod İlkinin normal olarak veritabanından aldığı bazı bilgileri sağlamanız gerekecektir. Bu post http://blog.oneunicorn.com/2012/04/21/code-first-building-blocks/, bunu yapmak için DbModelBuilder'ı nasıl kullanacağınızı ve modelden bir DbContext'i nasıl oluşturacağınızı gösterir. Bunun gibi bazı kodlar ile bitireceğiz: Muhtemelen modeli nesne önbelleğe ziyade her farklı test için tekrar oluşturmak istersiniz

var modelBuilder = new DbModelBuilder(); 
modelBuilder.Entity<Foo>(); 
var model = modelBuilder.Build(
       new DbProviderInfo("System.Data.SqlClient", "2008")).Compile(); 

.

DbContext'in veritabanına bağlanmayı denemesini önlemek için veritabanı başlatıcılarını da devre dışı bırakmalısınız. Örneğin, bağlamı kullanmadan önce bir çağrı aşağıdaki gibi yapın:

Database.SetInitializer<FooContext>(null); 

Şimdi sadece o üretecektir Ne SQL görmek için herhangi bir sorguyu ToString kullanabilirsiniz. LINQ ifadeyi işleyemiyorsa, bir istisna alacaksınız. Bu atacağım

using (var context = new FooContext(model)) 
{ 
    Expression<Func<Foo, bool>> predicate = x => x.Name == "Foo"; 

    Console.WriteLine(context.Foos.Where(predicate)); 
} 

:

using (var context = new FooContext(model)) 
{ 
    var someOtherFoo = new Foo(); 
    Expression<Func<Foo, bool>> predicate = x => x == someOtherFoo; 

    Console.WriteLine(context.Foos.Where(predicate)); 
} 

Açıkçası sadece konsola baskı olmayacak testler yazılı ziyade bir çeşit çalışması yapıyorsanız Örneğin, bu sorguyu yazdırılacaktır iddiaların/kontrollerin.

+0

Mükemmel, teşekkürler! –

İlgili konular