24

SQL:

SELECT
   u.id,
   u.name,
   isnull(MAX(h.dateCol), '1900-01-01') dateColWithDefault
FROM universe u
LEFT JOIN history h 
   ON u.id=h.id 
   AND h.dateCol<GETDATE()-1
GROUP BY u.Id, u.name
4

4 に答える 4

10

解決策は、null値の処理をコードに延期するものではありますが、次のようになります。

昨日のDateTime=DateTime.Now.Date.AddDays(-1);

var collection=
    from u in db.Universe
    select new
    {
        u.id,
        u.name,
        MaxDate =(DateTime?)
       (
           from h in db.History
           where u.Id == h.Id
           && h.dateCol < yesterday
           select h.dateCol 
       ).Max()
    };

これはまったく同じSQLを生成しませんが、同じ論理結果を提供します。「複雑な」SQLクエリをLINQに変換することは、必ずしも簡単ではありません。

于 2008-08-03T21:31:17.863 に答える
1
var collection=
    from u in db.Universe
    select new
    {
        u.id,
        u.name,
        MaxDate =(DateTime?)
       (
           from h in db.History
           where u.Id == h.Id
           && h.dateCol < yesterday
           select h.dateCol 
       ).Max()
    };

上記のコードを使用するだけで、これで問題なく動作するはずです。

于 2016-04-18T12:16:03.590 に答える
0

コンストラクトを使用join intoしてグループクエリを作成します。

TestContext db = new TestContext(CreateSparqlTripleStore());
var q = from a in db.Album
        join t in db.Track on a.Name equals t.AlbumName into tracks
        select new Album{Name = a.Name, Tracks = tracks};
foreach(var album in q){
    Console.WriteLine(album.Name);
    foreach (Track track in album.Tracks)
    {
        Console.WriteLine(track.Title);
    }
}
于 2008-09-17T05:28:38.990 に答える
0

これは完全な答えではありませんが、左側の結合部分では、次のように DefaultIfEmpty 演算子を使用できます。

var collection = 
from u in db.Universe
join history in db.History on u.id = history.id into temp
from h in temp.DefaultIfEmpty()
where h.dateCol < DateTime.Now.Date.AddDays(-1)
select u.id, u.name, h.dateCol ?? '1900-01-01'

まだコマンドを実行する必要がなかったgroupbyので、間違ったパスに送らないように省略しました。他に 2 つの簡単な注意事項があります。上記のようにそれを回避する方法はありますが、実際には2つのパラメーターに参加できませんでした。また、?? isnull演算子は、SQL の代わりに非常にうまく機能します。

于 2008-08-28T19:09:00.853 に答える