2012-01-22 6 views
0

可能性の重複:C#でLINQを使用して
'Contains()' workaround using Linq to Entities?が含まれています()

、私は次のような問題を持っています。

私は3つの条件を用いて、大きなテーブルから行を選択する必要があります。 を - 「schooljaarは」前に設定した値、である必要があり、 - 「p_bamatypeは」(設定で定義されたリスト内の値ではないことが必要ですこれは、StringCollection) ある - 「p_stdgeb」は設定で定義されたリストでない値にする必要がある(これもStringCollectionです)

私はこのコードを持っている:

var set = (db.SA_Opleiding.Where(opleiding => opleiding.schooljaar == schooljaar 
           && 
           !Properties.Settings.Default.Admin_Studiegebieden_Exclude.Cast 
                  <string>().ToList().Contains(
                   opleiding.p_stdgeb.ToString()) 
           && 
           !Properties.Settings.Default.Admin_Studietypes_Exclude.Cast 
                  <string>().ToList().Contains(
                   opleiding.p_bamatype.ToString())) 
          .Select(opleiding => new OpleidingModel() 
            { 
             Id = opleiding.p_opleiding, 
             LanNames = 
              new Dictionary 
              <string, string>() 
               { 
                { 
                 "NL", 
                 opleiding. 
                 opleidingNL 
                 }, 
                { 
                 "FR", 
                 opleiding. 
                 opleidingFR 
                 }, 
                { 
                 "EN", 
                 opleiding. 
                 opleidingEN 
                 } 
               } 
            })) 
         .ToList<OpleidingModel>(); 

     return set; 

はしかし、LINQは、変換失敗しますContainsメソッド。私は同じ問題を抱えている他の人について読んでいますが、私はこれに対してまともな解決策を見つけることができません。実際に説明されている問題の解決策はありますか?だから、私が正確に必要なのは、LINQに相当するNOT IN(文字列のコレクション)です。

+0

で[ここです](http://stackoverflow.com/questions/88473/how-to-do-a-where-in-values-in-linq 〜エンティティ-3〜5)。 –

答えて

2

さまざまな重複した回答のいずれかが役に立たない場合は、here is a linkの可能性があります。

public static class QueryExtensions 
{ 
    public static IQueryable<TEntity> WhereIn<TEntity, TValue> 
    (
     this ObjectQuery<TEntity> query, 
     Expression<Func<TEntity, TValue>> selector, 
     IEnumerable<TValue> collection 
    ) 
    { 
     ParameterExpression p = selector.Parameters.Single(); 

     //if there are no elements to the WHERE clause, 
     //we want no matches: 
     if (!collection.Any()) return query.Where(x=>false); 

     if (collection.Count() > 3000) //could move this value to config 
      throw new ArgumentException("Collection too large - execution will cause stack overflow", "collection"); 

     IEnumerable<Expression> equals = collection.Select(value => 
      (Expression)Expression.Equal(selector.Body, 
       Expression.Constant(value, typeof(TValue)))); 

     Expression body = equals.Aggregate((accumulate, equal) => 
      Expression.Or(accumulate, equal)); 

     return query.Where(Expression.Lambda<Func<TEntity, bool>>(body, p)); 
    } 
} 

が利用でき、それのようないくつかの他の人があります。これは、LINQのツーエンティティへの拡張を参照しています。

db.SA_Opleiding.WhereIn(v => v.SomeCollection); 

私が今までこの特定の拡張メソッドを使用していないが、それらはすべてしている:私は上記のコードのためのコンテキストを提供し、ここでの使用も可能であるしまし

EDIT

基本的に同じ原則に基づいています。

+0

あなたの答えをありがとう、しかし私はどこでこのコードを置くと思いますか? – Mortana

+0

あなたが実行しようとしているコードからアクセス可能な静的なクラスで.NET 3.5(私はそう思う)を使用していると仮定します。詳細については、[拡張メソッド(C#プログラミングガイド)](http://msdn.microsoft.com/en-us/library/bb383977.aspx)を参照してください。 –

+0

@Mortana - 半有効なコンテキストを含めるように私の答えを更新しました。 –

0

Contains()に.Any()メソッドを代入すると私にとって問題がありました。私が交換さ:

objListing.Contains(myObject) 

objListing.Any(x => x.Object.ID == myObject.ID) 
関連する問題