0

制限する必要がある LINQ to SQL (DBML 経由) を使用していますが、問題が発生しています。動的 LINQ を使用して、エンド ユーザーが以前に決定した変数を送信しています。メインのdbテーブルとそれに接続する5つのテーブルからのデータを(左外部結合を介して)保持するdbにVIEWがあります。私は動的 LINQ を使用している (そしてそうしなければならない) ため、BD からの結果セットは .AsQueryable() である必要があり、IQueryable 結果セットを作成します。これが何をしているかの例です:

ビューが車の情報 (メーカー、モデル、年、色、走行距離、サービス記録) を保持しているとします。ユーザーが、今年整備されたすべてのフォード マスタングを見たいと入力した場合、結果セットはそのように返されます。

[uniqueID - 1][Ford][Mustang][1/1/2012](service date)
[uniqueID - 1][Ford][Mustang][2/1/2012](service date)
[uniqueID - 1][Ford][Mustang][3/1/2012](service date)
[uniqueID - 1][Ford][Mustang][4/1/2012](service date)

これは問題ありませんが、この特定のムスタングが今年 4 回サービスを受けたと仮定しましょう。

ただし、ユーザーがすべての黒のフォードを表示するだけの場合は、戻ってきます

[uniqueID - 1][Ford][Mustang]
[uniqueID - 1][Ford][Mustang]
[uniqueID - 1][Ford][Mustang]
[uniqueID - 1][Ford][Mustang]
[uniqueID - 2][Ford][Taurus]

サービスが null で、返される IQueryable に .Distinct() がある場合でも、サービスごとに行が返されます。

return data.Distinct().OrderBy(strOrderBy).Select("New(" + strItems + ")");

私ができる必要があるのは、その IQueryable を取得して、そこから個別の値を取得することです。入ってくる変数は動的であるため、これを行う方法がわかりません。

4

2 に答える 2

1

どのORMを使用していますか? 特に、ORM が DB に送信する sql で「個別の」呼び出しを送信しない場合は、ORM が異なれば動作も異なります。

その行を実行する前に、「データ」変数は解決されていますか? その場合、Linq to SQL ではなく、Linq to Objects で Distinct を実行しています。

あなたの例から、最も直接的なことは、2 番目の Distinct オーバーロードを使用してクエリに IEqualityComparer を実装することです。次のようになります。

return data.Distinct(new YourEqualityComparer()).OrderBy(strOrderBy).Select("New(" + strItems + ")");

注文をサーバー側で行う場合は、個別の前に OrderBy 呼び出しをプッシュする必要があることに注意してください。

このトピックに関連する便利なリンクを次に示します。

http://msdn.microsoft.com/en-us/library/ms132151.aspx http://blog.lavablast.com/post/2010/05/05/Lambda-IEqualityComparer3cT3e.aspx http://www.codeproject. com/Articles/94272/A-Generic-IEqualityComparer-for-Linq-Distinct

于 2012-04-30T12:54:53.667 に答える
1

はデータの行全体に対して実行されていると思わ.Distinct()れます。それらはすべてサービス日が異なるため、重複するものはなく、.Distinct().

メソッドの順序を次のように変更してみてください。

return data.OrderBy(strOrderBy).Select("New(" + strItems + ")").Distinct();
于 2012-04-30T13:30:32.223 に答える