0

私はタイムシート アプリケーション (Silverlight) を作成していますが、linq クエリを機能させることに完全に行き詰まっています。私は linq を知っていて、Linq to Objects、linq to SQl、linq to Entities など、Linq の本を読み、そこから多くの例を作成しました。使用します)。私はさらに多くのLinqを研究する予定ですが、この1つのクエリを機能させる必要があるだけです.

だから私は仕事のすべてのアイテムをリストするアイテムと呼ばれるエンティティを持っています、そしてそれはシリアル番号です

そのため、Job.ID int、ID int、SerialNo long

また、シフト日、ジョブ番号、開始シリアル番号と終了シリアル番号を含む Timesheets エンティティもあります。

Job.ID int、ShiftDate 日付、Shift int、StartNo long、EndNo long

ユーザーがオートコンプリート ボックスからジョブを選択すると、timesheets エンティティでそのジョブの MAX(SerialNo) を検索したいと考えています。それが null の場合 (つまり、何も作成されていない)、そのジョブの Items エンティティから MIN(SerialNo) を検索したい (つまり、作成する最初のシリアル番号は何か)

最初またはデフォルトが必要であり、Items から MIN(SerialNo) をデフォルトとして指定する必要があることに気付きました。

私のタイムシート画面はデータソースとして TimesheetProperty を使用しています

Timesheets エンティティから MAX(SerialNo) を取得するために、次のことを試しました。

var maxSerialNo =
            (from ts in this.DataWorkspace.SQLData.Timesheets
             where ts.Job.ID == this.TimesheetProperty.Job.ID
             select ts.StartNo).Min();

しかし、次のエラーが発生します。

インスタンス引数: 'Microsoft.LightSwitch.IDataServiceQueryable' から 'System.Collections.Generic.IEnumerable' に変換できません

'Microsoft.LightSwitch.IDataServiceQueryable' には 'Min' の定義が含まれておらず、最適な拡張メソッド オーバーロード 'System.Linq.Enumerable.Min(System.Collections.Generic.IEnumerable)' にはいくつかの無効な引数があります

これを使用できない理由もわかりません:

var maxSerialNo = this.DataWorkspace.SQLData.Timesheets.Min(ts => ts.StartNo);

誰かが私を正しい方向に向けることができますか?

ありがとう

マーク

4

1 に答える 1

1

IDataServiceQueryablehasのような LINQ 演算子の完全なセットをサポートしていませんIEnumerable

IDataServiceQueryable – これは LightSwitch 固有の型であり、中間層に対してリモート可能で、最終的にデータベース サーバーに対して発行される "LINQ のような" 演算子の制限されたセットを許可します。このインターフェイスは、LightSwitch クエリ プログラミング モデルの中核です。IDataServiceQueryable には、IEnumerable の結果を返すクエリを実行するメンバーがあります。【参考

IEnumerable考えられる解決策は、最初にクエリを実行してを呼び出して型のコレクションを取得し、次に最初のクエリ結果に対して.ToList()呼び出すことができます。.Min()ただし、大量のデータがある場合は.ToList()、クエリに一致するすべてのデータを取得し、クライアント側でさらに処理を行うため、非効率的であるため、これはお勧めできません。

もう 1 つの方法は、サポートされている演算子のみを使用してクエリを変更し、IDataServiceQueryable不要なデータをクライアントに取得しないようにすることです。たとえば、最小値を取得するには、 operatorを使用する代わりに、使用してから最初のデータを取得StartNoできます。orderby descending.Min()

var minStartNo = 
            (
                 from ts in this.DataWorkspace.SQLData.Timesheets 
                 where ts.Job.ID == this.TimesheetProperty.Job.ID
                 orderby ts.StartNo descending select ts
            ).FirstOrDefault(); 
于 2014-03-31T07:57:51.980 に答える