2012-04-02 7 views
1

私はトラブルLINQのツーSQLLINQのツーSQL条件とC#の機能を混合

に条件とC#の機能をミキシングが生じています、私は、データベーステーブル「もの」と地元のC#の機能を持っているとしますBOOL isGood(物、params)

私はテーブルから行を選択するためにその関数を使いたいと思います。もちろん

var bad = dataContext.Things.Where(t=>t.type=mytype && !isGood(t,myparams)) 
dataContect.Things.deleteAllOnSubmit(bad); 

または

if (dataContext.Things.Any(t=>t.type=mytype && isGood(t,myparams))) 
{ 
    return false; 
} 

これは動作しません、LINQのは、SQL文の中に私の機能を変換する方法はありません。したがって、これは次のようになります:

NotSupportedException:メソッド 'Boolean isGood(thing、params)'にはSQLへの変換がサポートされていません。

これを機能させるには、これを再設計する最良の方法は何ですか?

私は文を分割し、このようなリストに変換することができます。

List<Things> mythings dataContext.Things.Where(t=>t.type=mytype).toList() 
if (mythings.Any(t=>isGood(t,myparams))) 
{ 
    return false; 
} 

これは動作しますが、全体のリストはすべてのケースで生成しなければならないため、非効率です。 そして、私は結果とdeleteAllOnSubmitを行うことができるとは思わない

toList()を呼び出す代わりにmythingsをforeachすることができます。しかし、やっかいだと思う。

私には他にどのようなオプションがありますか、ここで推奨されるアプローチは何ですか?

編集:asEnumerable()を呼び出す

は別のオプションをあるように思われ、少なくともToListメソッド()よりも優れているようです。私。

dataContext.Things.Where(t=>t.type=mytype).asEnumerable().Any(t=>isGood(t,myparams)) 
+0

isGood()関数は、含めることができる単純な関数ですか?それがLinqとして表現できるのであれば、これははるかに簡単な解法です。 –

+0

かなり複雑です。とりわけ、item1が他のテーブルのitem2の中に入るかどうかを確認します。ローテーションは許可されています – HugoRune

+0

そうです。私はそこにオプションがあるとは思わない。リスト全体を元に戻す必要があります。主キーを見つけて、それらのすべてを使って提出すると、あなたの削除を行います。他の誰かがそれについて考えることができるかどうかを知ることに興味があるので、誰かがその方法を思いつくことができるかどうかを知るために私はそれを好きになるでしょう。 –

答えて

2

それにローカルC#の機能を実行するためにデータベースから戻ってリスト全体を引っ張ると非効率的なようですが、あなたのisGood()関数がローカルの場合、あなたがしなければならないと思いますどのようなものかもしれません。

isGood()関数をLinqに変換できる場合は、toList()呼び出しの前に適用してSQLに変換され、リスト全体が取得されないようにすることができます。