0

アプリケーションに次の LINQ クエリがあります。データ ソースは、List<Borehole>テスト目的でメモリ内に構築されます。

var lq = from p in data
         group p by p.CostCenter into g
         select new {  CostCenter = g.Key, 
                       AverageDepth = g.Average(p => p.OriginalDepth),
                       NullDepthCount = g.Count(p => p.OriginalDepth == null) };

それは完全に実行され、望ましい選択結果が得られます。ただし、LINQPad で次のクエリを実行すると、次のようになりますInvalidOperationException

var lq = from p in Boreholes
          group p by p.CostCenter into g
          select new {  CostCenter = g.Key, 
                        AverageDepth = g.Average(p => p.OriginalDepth),
                        NullDepthCount = g.Count(p => p.OriginalDepth == null) };

ここで、データ ソースは SQLite データベース内のテーブルであり、IQ 2.0.5.0 LINQPad ドライバーを使用して LINQPad にリンクされています。エラーメッセージは次のとおりです。

No generic method 'Where' on type 'System.Linq.Queryable' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic.

を使用してLINQPad v4.42.01います。アプリケーション サンプルは、対 コンパイルされ.NET Framework 4 Client Profileます。

OriginalDepthプロパティのタイプはですdouble?

クエリが LINQPad で機能しないのはなぜですか / アプリケーションで機能するのはなぜですか?

LINQPad クエリを修正するにはどうすればよいですか?

アップデート

Boreholeダミークラスの定義とダミーdataリストの作成を含むアプリケーション コードをコピーして LINQPad に貼り付けると、問題なく動作します。したがって、問題は、LINQPad がアプリケーションで機能するクエリ形式を拒否することではありません。

問題は次のようになります:なぜオブジェクトに対して使用できるのにg.Count(p => p.OriginalDepth == null)List<Borehole>LINQPad によってアクセスされる SQLite テーブルに対して同じクエリを実行すると、InvalidOperationException上記のようになりますか?

更新 2

g.countクエリの一部の述語が何であるかは関係ありません。次のコードを SQLite データベース テーブルに対して実行すると、同じエラーが発生します。

var lq2 = from p in Boreholes
          group p by p.CostCenter into g
          select new { NullDepthCount = g.Count(p => true )}; 
4

1 に答える 1

3

すべての Linq プロバイダーがすべての機能をサポートしているわけではないため、IQ プロバイダーがサポートしていない機能をここで見つけた可能性があります。

テーブルのサイズが小さい場合 (そして sqlite データベースは通常小さい場合)、次のことができます。

var lq = from p in Boreholes.ToList()
      group p by p.CostCenter into g
      select new {  CostCenter = g.Key, 
                    AverageDepth = g.Average(p => p.OriginalDepth),
                    NullDepthCount = g.Count(p => p.OriginalDepth == null) };

明らかに、これはボアホール テーブル全体をメモリにロードするため、クエリは Linq To オブジェクト クエリになり、機能します。

アップデート。

また、単純に置き換えているようにも見えます。

   NullDepthCount = g.Count(p => p.OriginalDepth == null)

元のクエリで

   NullDepthCount = g.Where(p => p.OriginalDepth == null).Count() 

つまり、データをメモリに取り込む必要はありません。

于 2012-07-11T17:57:22.203 に答える