2

基本的に同じことを行う 2 つの SQL ステートメントがあります。つまり、レコード グループの日時フィールドに基づいて、テーブルから最後のレコードを取得します。私はデータ優先の Entity Framework モデルを使用しています。LINQ Lambda 関数を使用して、これらの SQL ステートメントのいずれかをどのように記述しますか?

つまり、

var u = db.AccessCodeUsage.Where(...).GroupBy(...)

それよりも

var u = from a in db.AccessCodeUsage
        where ...
        group by ...

SQL ステートメント:

SELECT  *
FROM    AccessCodeUsage a  
WHERE   NOT EXISTS (SELECT  1 
                    FROM    AccessCodeUsage 
                    WHERE   LocationId = a.LocationId
                    AND     Timestamp > a.Timestamp)

SELECT    a.*
FROM    AccessCodeUsage a
WHERE   a.Timestamp = 
        (SELECT MAX(Timestamp)
        FROM    AccessCodeUsage
        WHERE   a.LocationId = LocationId
        AND     a.AccessCode = AccessCode
        GROUP   By LocationId, AccessCode)
4

2 に答える 2

3

メソッド呼び出し形式が必要であるが、解決するのが難しい場合は、最初に他の構文を使用してください。

from a in db.AccessCodeUsage
  orderby a.TimeStamp descending
  group a by a.LocationId into grp
  from g in grp select g.First();

次に、各句を一度に 1 つずつ取得して、メソッド呼び出しに変換します。

db.AccessCodeUsage
  .OrderByDescending(a => a.TimeStamp)
  .GroupBy(a => a.LocationId)
  .Select(g => g.First());

そこから、わざわざ linq-syntax フォームを最初に書き出すことなく、2 番目のワークアウトを行うことができます。

db.AccessCodeUsage
  .OrderByDescending(a => a.TimeStamp)
  .GroupBy(a => new {a.LocationId, a.AccessCode})
  .Select(g => g.First());

(ただし、タイムスタンプが一意であることが保証されていない場合、質問で指定された SQL に余分な不適切な結果が含まれる可能性があるという点で、バグの可能性があるものは含まれていません)。

現在生成された SQL を確認することはできませんが、結果が同等であることを願っています (必ずしも一致しない場合)。グループ化が SQL にうまく変換されない場合もありますが、これがその 1 つになるとは思えません。

于 2012-08-16T22:05:36.373 に答える
0

最初のSQL文に対応する以下を使用することになりました。

// Retrieve only the latest (greatest value in timestamp field) record for each Access Code
var last = AccessCodeUsages.Where(u1 => !AccessCodeUsages
                           .Any(u2 => u2.LocationId == u1.LocationId &&
                                      u2.AccessCode == u1.AccessCode &&
                                      u2.Timestamp > u1.Timestamp));
于 2012-10-03T12:32:14.500 に答える