2010-12-16 4 views
0

私のアプリケーションがWindows 7、64-bitの特定のデータセットでクラッシュするという条件が発生しました。他のすべてのプラットフォームは、同じデータセットで正常に動作します。私は多くの人々が投稿したBuildNotContainsExpressionで私のアプリがクラッシュしていると判断しました。BuildNotContainsExpressionにより、Windows 7 -64-bitで大きなデータセットが設定されたSystem.StackOverflowExceptionが発生する

ヒープのメモリを使用して式を構築する方法はありますか?
私はusersActiveリストを処理して、一度に小さなチャンクを処理する必要がありますか(1000など)?
他に何かありますか?

List<int> usersActive = myContext.myTable.Select(a => a.tableUsersSnapshot.id).Distinct().ToList(); 
// The code blows up (only on Win7 64-bit) on this line when usersActive is large ~4000 
// (probably will blow up on all platforms if usersActive is sufficiently large) 
expTest = CustomExpressions.BuildNotContainsExpression<tableUsersSnapshot, int>(a => a.id, usersActive); 
List<tableUsersSnapshot> usersToDelete = myContext.myTableSnapshot.Where(expTest).ToList(); 
// Delete the objects in the delete list 
foreach(tableUsersSnapshot user in usersToDelete) 
{ 
    myContext.DeleteObject(user); 
} 

編集:ここではBuildNotContains機能だ - それは再帰的ではありません。

public static Expression<Func<TElement, bool>> BuildNotContainsExpression<TElement, TValue>(Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values) 
    { 
     if (null == valueSelector) { throw new ArgumentNullException("valueSelector");} 
     if (null == values) { throw new ArgumentNullException("values"); } 

     ParameterExpression p = valueSelector.Parameters.Single(); 

     // p => valueSelector(p) != values[0] && valueSelector(p) != ... 

     if (!values.Any()) 
     { 
      return e => true; 
     } 

     var equals = values.Select(value => (Expression)Expression.NotEqual(valueSelector.Body, Expression.Constant(value, typeof(TValue)))); 
     var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.And(accumulate, equal)); 
     return Expression.Lambda<Func<TElement, bool>>(body, p); 
    } 

ここに私のEDMX図の該当部分です: alt text

+0

質問名でStackOverflowに必要なコメント:) –

+0

BuildNotContainsはどのように見えますか?それは再帰的に聞こえるが、私はそれがそうである理由を考えることができない。 –

+0

また、 'どこに!someArray.Contains(a.Id)'がEFで動作しないのですか?私はそれがLINQ-to-SQLで動作することを期待しています。 –

答えて

0

EF 4はBuildContainsExpressionを必要としないが、されています以前のバージョンを使用していますか?

2つのテーブルを結合してIDを見つけようとしているようですが、SQLサーバーではなくすべてのクライアント側で実行しているようです。

代わりに、2つのテーブル間の結合を使用して、対応するユーザーを持たないテーブルスナップショットを検索します。例を参照してくださいhttp://www.hookedonlinq.com/OuterJoinSample.ashx

2つのテーブルの間にFK関係があった場合は、削除するレコードを選択することができます。 .Any(...)句。

+0

私はEF 3.5と思われるVisual Studio 2008を使用しています。私はあなたの例を見ていきます。私は、ファームウェア・エンジニアであり、実際にこのデータベースを学習しようとしています。これまでのところ、たとえ彼らが最も効率的ではないとしても、私は働くことを得ました。 – ejwipp

+0

あなたは最後の声明を詳しく述べてください。私がクエリする最初のテーブル(元の質問でmyTableとして表示)には、usersSnapshotテーブルへのFKが含まれています。 – ejwipp

+0

アソシエーションがある場合、これは 'myContext.myTableSnapshot.Where(ts =>!ts.myTable.Any())'のような単純なものになります。 EDMXダイアグラムを投稿すると役立ちます。 EFはV1からV4になりました。 V4を使用していない場合はできるだけスイッチを切り替えることを強くお勧めします。 –

関連する問題