2009-03-10 7 views
1

このLINQクエリは、存在する場合は完全一致を返し、存在しない場合は "startswith"結果を返すようにしています。今すぐ両方を返します。LINQ to DataTable結果のフィルタリング

SearchParam = "Mundt氏" 結果= Mundt氏、マーク・ | Mundt、Chris | Mundth、ロリ

public static DataTable SearchPerson(string SearhParam) 
    { 
     var context = new ConnectDataContext(Properties.Settings.Default.ConnectConnectionString); 
     var myQuery = (from person in context.tblPersons 
          where person.LastName.StartsWith(SearhParam) || person.LastName == SearhParam 
          orderby person.LastName 
          select new { person.PersonID, person.LastName, person.FirstName, person.SSN }); 

     var dataTable = myQuery.CopyLinqToDataTable(); 

     return dataTable; 
    } 

答えて

3

試してみてください。

 var persons = (from person in context.tblPersons 
          orderby person.LastName 
          select new { person.PersonID, person.LastName, person.FirstName, person.SSN }); 
     var filteredPersonsList = persons.Where(p=>p.LastName == SearhParam).ToList(); 
     if(filteredPersons.Count == 0) 
      filteredPersonList = persons.Where(p=>p.LastName.StartsWith(SearhParam)) 
         .ToList(); 
     var dataTable = filteredPersonsList.CopyLinqToDataTable(); 

     return dataTable; 

注:それは(それがなかった場合は、1つ完全一致を探すため、そしてSTARTSWITHに1つ、デシベルに2本の安打を行います最初のものを見つける)。

もう1つのオプションは、両方を取得してからメモリに再フィルタリングすることです。

+0

データベースに2ヒットするのはおそらくより速いでしょう。これは、一致が存在すると完了したためです。メモリ内でフィルタリングする場合は、O(n)検索だけでまだ未だ作業があるかどうかを知る必要があります。 –

+0

yですが、それはシナリオごとに大きく異なります。人の量がかなり少ない場合、往復の遅延は長くなります。それは、私はそれを汗をかくことはない、[ビジネスを挿入する]がうまくいく場合、システムに多くの人がいるだろう:) – eglasius

+0

私のシナリオはローカルデータベースを照会するので、私は複数の呼び出しでうまくいく。 ありがとう! –

関連する問題