[ad_1]
こんにちは、みんな、
私はlinqクエリを書くのが初めてです。 期待どおりの結果が得られる SQL クエリを作成しました。それを LINQ c# クエリに変換する必要があります。Linqer をインストールする権限がありません。誰か助けてください。 ありがとう。 これが私のSQLクエリです
SQL
select * from PatVisit p inner join Device d on d.PattId = p.PatId and d.SyncDate is not null where p.VisitDate in ( select max(VisitDate) from PatVisit pv where VisitId in (4,7,2,8,9) group by PatId ) and DATEDIFF(d,p.visitDate,GETDATE()) <10
私が試したこと:
LinqPad を試しましたが、そこで変換できません。
解決策 2
最初に質問に対する私のコメントを読んでください。
私が述べたように、あなたのクエリはの使用のために効率的ではありません [in
] 句を 2 回。
SQL クエリを改善してみましょう。 したがって、この:
SQL
select * from PatVisit p inner join Device d on d.PattId = p.PatId and d.SyncDate is not null where p.VisitDate in ( select max(VisitDate) from PatVisit pv where VisitId in (4,7,2,8,9) group by PatId ) and DATEDIFF(d,p.visitDate,GETDATE()) <10
これで置き換えることができます:
SQL
DECLARE @finaldate DATETIME SELECT @finaldate = DATEADD('d', -10, GETDATE()) SELECT p.* FROM ( SELECT p1.*, ROW_NUMBER() OVER(PARTITION BY p1.PatId ORDER BY p1.VisitDate DESC) RowNo FROM PatVisit p1 WHERE p1.VisitDate >= @finaldate AND p1.VisitId IN(4,7,2,8,9) ) p INNER JOIN Device d on d.PattId = p.PatId and d.SyncDate is not null WHERE p.RowNo=1;
ご覧のとおり、私は使用しました ROW_NUMBER() 関数[^]、ネストされたクエリから最初の行のみを取得するのに非常に便利です。
ご了承ください WHERE
条件が含まれていません 日付差分[^] 関数、比較によってデータを制限できるため VisitDate
最終日まで( @finaldate
変数)。
上記のクエリはおそらくさらに改善される可能性がありますが、データにアクセスできず、データ構造が表示されません…
linqクエリに関しては…
該当するものはありません [IN
] Linqの句ですが…使用できます どこ[^] 一緒に どれでも[^] 方法。 見る:
C#
int[] vid2get = new int[]{4,7,2,8,9}; var qry1 = PatVisit_context .Where(x=> vid2get.Any(y=>y==x.VisitId));
したがって、linq クエリの最終バージョンは次のようになります。
C#
int[] vid2get = new int[]{4,7,2,8,9}; DateTime finaldate = DateTime.Now.AddDays(-10); var qry1 = (from pv in PatVisit_context .Where(x=> vid2get.Any(y=>y==x.VisitId) && x.VisitDate >= finaldate) .GroupBy(x=> x.PatId) .Select(grp=> grp.OrderByDescending(y=>y.VisitDate).First()) join d in Device_context on pv.PatId equals d.PatId && d.SyncDate != null select pv) .ToList();
幸運を!
解決策 1
[ad_2]
コメント