2011-01-18 10 views
1

私は、ユーザーが入力した値に応じてデータベースを照会するものに取り組んでいます。 たとえば、ユーザーは国(おそらく「Au」)を検索でき、「Au」を含む国が返されます。リストに基づいたOrの数

問題は、この結果を達成するために述語に「or」ステートメントを追加する必要がありますが、それについてどう考えているかわかりません。

は今のところ、私は

List<int> ids; 
ids = (from d in DTDC.Countries 
     where d.Name.ToLower().Contains(country.ToLower()) 
     select d.CountryID).ToList(); 

var SearchPredicate = PredicateBuilder.True<DLC>(); 

// Example 
searchPredicate = searchPredicate.And(c => c.CountryID == 0 || c.CountryID == 1); 

は、だから私は私のLINQクエリから返されたリスト内の値に応じて

searchPredicate = searchPredicate.And(c => c.CountryID == 0 || c.CountryID == 1); 

この文を生成する必要があります。例えば

リストは値0、1、7を持っている場合、クエリは

searchPredicate = searchPredicate.And(c => c.CountryID == 0 || c.CountryID == 1 || || c.CountryID == 7); 

する必要がありますうまくいけば、私がやろうとしているかを理解するために誰かのために十分に明確なのthats :)

答えて

0

あなたがここで何をしようとしているかわからない..リストに3つの要素がある場合、c => c.CountryID == 0 || c.CountryID == 1 || c.CountryID == 2を生成しますか?

もしそうなら、なぜ(c.CountryID < ids.Count)だけではないのですか?

また、1つの国のみを返すクエリを実行する場合は、countryID == 0でフィルタリングしてもよろしいですか?

+0

数字が必ずしも連続しているわけではないためです。たとえば、返される戻りIDはID 0と17です。つまり、 である必要があります。c => c.CountryID == 0 || c.CountryID == 17 私は1つのIDを扱うために別のものも持っています。私がここで探しているソリューションは複数のものです。 – Wraiyth

+0

あなたが投稿のサイズに依存していると言ったとき、私はあなたの投稿を誤読しました。 c.CountryIDがidsで返された国のどこにあるかをフィルタリングしたいですか? – Rob

+0

うん、まあまあ。したがって、リストには0,1,5,10という値が含まれていて、私のステートメントに含まれるすべての*が必要です。私が離れている限り、彼らはすべて個別の述語にする必要があります。各IDに1つを追加することはできません(少なくとも試しても機能しません) – Wraiyth

1

これはInメソッドの完全実装です。あなたはそれらのうちのいくつかを選ぶことができます。

public static class Ext 
{ 
    public static bool In<T>(this T val, params T[] values) 
    { 
     return val.In(EqualityComparer<T>.Default, values); 
    } 

    public static bool In<T>(this T val, EqualityComparer<T> comparer, params T[] values) 
    { 
     foreach (var v in values) 
     { 
      if (comparer.Equals(val, v)) return true; 
     } 
     return false; 
    } 

    public static bool In<T>(this T val, Func<T, T, bool> comparer, params T[] values) 
    { 
     foreach (var v in values) 
     { 
      if (comparer(v, val)) return true; 
     } 
     return false; 
    } 
} 

使用法:あなたはより多くのフィルタ処理したい場合は

int num = 1; 
bool exist = num.In(2, 3, 4, 5); 
+0

著者が自分の名前を持つすべての国をサーバーから最初に読み込みたいのなら、それは本当です。しかし、これは著者が言及していないと思います。 ;) –

+0

これは既にデータベースから.ToList()でロードされています – Rob

+0

私は最初のクエリの結果を別のクエリに渡す必要があるので、これはどのように適しているのかわかりません。 – Wraiyth

0

は、なぜあなたはそれのListを作成していますか?あなたが追加することができるものに

public static class CountryFilters 
{ 
    public static IQueryable<Country> ThatContainsName(this IQueryable<Country> query, string country) 
    { 
     return query.Where(y => y.Name.ToLower().Contains(country.ToLower())); 
    } 
} 

public IQueryable<Country> GetAllCountries() 
{ 
    return from d in DTDC.Countries select d; 
} 

は次に、あなたのようなIQueryable<Country>のための拡張メソッドを持つことができます。たとえば、次のように...代わりにIQueryableを返し、その後、あなたはその上で複数のフィルタを適用することができますより多くのフィルタを使用し、最後にクエリをフィルタリングしたときにそのIDを抽出することができます。

また、これらのフィルタを適用すると、生成されたSQLの品質が良いことを確認して、複数のクエリを作成することはありません。

関連する問題