10

Sql Server 2008 veritabanını sorgulayan ASP.NET MVC 3 ve Entity Framework 4 kullanılarak geliştirilmiş bir web sitem var. Bu, yaklaşık 10 alanlı bir arama formu içerir ve kullanıcı gönder düğmesini tıklattığında, yalnızca belirtilen arama alanlarını içeren bir Boş Varlık SQL isteğini dinamik olarak yaratır ve boş olanları atlar. İşe yarıyor. Çok uzak çok iyi.Sql Sunucu Freetext yoluyla Entity Framework

Şimdi, istemci alanlarından birine yönelik bir Tam Metin Arama davranışını istiyor. doğal olarak şimdiye kadar yalnızca kullandım çünkü

  • Ben FTS sözdizimi sarmak için saklı yordamları kaçınmak istiyorum tam metin aramasını destekleyen değil

    • Varlık Framework kapsamaz: (AFAIK) çünkü oldukça karmaşık olarak bu isteği bakın "statik" SP'ler, mantığı .NET kodunda tutar. Bu yüzden prosedürün içindeki sorguyu oluşturmamaya çalışmak istiyorum. Ve olası arama alanı kombinasyonu başına bir prosedür oluşturmak bir seçenek değildir. Bugüne kadar düşünebildiğim

    Çözümleri:

    • Alma
    • (ben bu olsa mümkün olduğundan emin değilim) WHERE yan tümcesinde bir Seach preadicate olarak saklı yordam veya kullanıcı tanımlı fonksiyonu koymak FTS, geçici bir tabloda tek başına sonuçlanır ve bu geçici tablodaki diğer filtreleri yürütür. Bu teknikle çok sayıda FTS sonucu varsa, kötü performanslardan korkuyorum ...

    Bunun için en iyi yolu nedir?

  • cevap

    6

    Yalnızca raw sql kullanamaz mısınız? Ardından mantığı .NET kodunuzda tutabilirsiniz.

    string sql = "DO FULLTEXT STUFF"; 
    MyObjectContext.ExecuteStoreQuery<MyEntity>(sql, .......); 
    
    +0

    +1 Bu iyi bir nokta: gibi

    Yani, görünecektir. Bu şekilde yaptığınızda, SQL sunucusunda tam metin araması yapabilirsiniz. Bence 'sp_executesql' gerekli değildir, çünkü doğrudan ExecuteStoreCommand tarafından kullanılmaktadır. –

    +2

    Bu öneri için teşekkürler. Varlık sorgu oluşturma, sonra SQL sorgusu oluşturma ve bir FREETEXT bir ile LIKE onayı yerine, bunu yürütmeden önce bunu geliştirmeye çalıştı. – Shtong

    1

    Sen performansı hakkında düşünmek zorunda değilsiniz - Eğer birleştirilmiş değeri karşılaştırılarak standart dizeyle endeksli tam metin araması yerini alacak çünkü bu zaten yavaş olacaktır.

    gitmek için üç yol vardır:

    • şimdi ancak arama çek ithal değerlendirilmesi için birleştirilmiş Sütunlarınızdan değeri
    • Kullanıcı tanımlı SQL işlev veya model defined function üzerinde GİBİ kullanırım olarak dinamik ESQL sorgusu oluşturmak senin EDMX modeli ve Linq-to-entities sorguları için maruz.
    • Tabloda arama yapmak yerine, doğrudan hesaplanmış sütunu (tüm on alanı içeren) kullanın ve bu sütunda "tam metin" i çalıştırın.

    Bu yöntemlerden herhangi biri performans için bir çözüm değildir.