1

Linq-To-SQLでc#関数と条件を混在させるのに問題があります

データベーステーブル「things」とローカルc#関数があるとします:bool isGood(thing、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))
4

1 に答える 1

2

リスト全体をデータベースからプルバックしてローカルのc#関数を実行するのは非効率に思えるかもしれませんが、isGood()関数がローカルの場合はそれを行う必要があります。

isGood()関数をLinqに変換できる場合は、toList()呼び出しの前に適用できるため、SQLに変換され、リスト全体が取得されません。

于 2012-04-02T13:42:06.373 に答える