2010-09-15 18 views
5

Bu işlev, bir kullanıcı arama girişi için bir kişi listesini döndürmek için kullanılır. Arama terimlerinin sayısı her zaman en az birdir, ancak çok olabilir.Linq 2 Sql sorgusuna belirsiz sayıda yan tümceleri dinamik olarak eklemek için doğru yol nedir?

public IList<Contact> GetContacts(string[] searchTerms) 
{ 
    using (dbDataContext db = new dbDataContext()) 
    { 
     var contacts = from _contacts in db.Contacts 
         orderby _contacts.LastName ascending, _contacts.FirstName ascending 
         select _contacts; 

     foreach (string term in searchTerms) 
     { 
      contacts = (IOrderedQueryable<Contact>)contacts.Where(x => SqlMethods.Like(x.FirstName, "%" + term + "%") 
                    || SqlMethods.Like(x.MiddleName, "%" + term + "%") 
                    || SqlMethods.Like(x.LastName, "%" + term + "%") 
                    || SqlMethods.Like(x.PreferredName, "%" + term + "%")); 
     } 

     return contacts.ToList<Contact>(); 
    } 
} 

Sorun, döngüdür. Oluşturulan sql doğru görünse bile (yalnızca terimlerin sayısı için doğru miktarda parantez oluşturulduğu halde) yalnızca son arama terimi kullanılır.

Örnek - iki terim ('andr', 'sm') iletirseniz, oluşturulan sql, gönderildiği gibi iki satır metni gösterir, ancak her iki blokta da param olarak yalnızca "sm" harfini kullanır.

Neyi yanlış yapıyorum? SqlMethods kullanmalı mıyım?

+1

Oluşturulan SQL'in doğru olduğunu söylüyorsunuz, yayınlayabilir misiniz? Oluşturulan SQL'i manuel olarak çalıştırmayı denediniz mi? –

+0

evet eğer manuel olarak çalışırsam çalışır, dizideki son 'terimi' tüm paramlar için param olarak kullanır. Garip. – IckleMonkey

cevap

5

Belki sorun, döngü değişken terimini yakalamaktır. Bunu deneyin:

foreach (string term in searchTerms) 
{ 
    string t = term; 
    contacts = ... // use t instead of term 
} 
+0

Sen benim arkadaşım bir dahidir. Eserleri!!! – IckleMonkey

+0

Bunun neden olacağını biliyor musunuz? – IckleMonkey

+0

Bir döngü değişkenini kapattığınız için, sorguyu çalıştırmaya geldiğinizde her zaman dizideki geçirilen son değerdir. Şu soruya bakın: http://stackoverflow.com/questions/227820/why-is-it-bad-to-use-a-iteration-variable-in-a-lambda-expression –

İlgili konular