0

私は LINQ プログラマーではないので、これはやや困惑しています。2 つのテーブルがあります。1 つ目は、StartDate と EndDate、および ID を含むスケジュールです。次に、InstanceDate と ScheduleID を持つ ScheduleInstance テーブル。Schedule.StartDate と Schedule.EndDate の間の毎日については、ScheduleInstance 行を作成する必要がありますが、24 時間先だけです。スケジュールは 24 時間の先読み時間内に作成および削除されるため、n 分ごとにチェッカーを生成して、ScheduleID の ScheduleInstance がその 24 時間枠内に存在するかどうかを確認する必要があります。

モデル:

public class Schedule
{
    public int ID { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}
public class ScheduleInstance
{
    public int ID { get; set; }
    public int ScheduleID { get; set; }
    public DateTime InstanceDate { get; set; }
}

LINQ の開始:

var skeds = from sked in context.Schedules
            join instance in context.ScheduleInstances
                on sked.ID equals instance.ScheduleID
            where ((sked.StartDate <= DateTime.Now) && (sked.EndDate >= DateTime.Now))
            select sked.ID;

(明らかに間違っている)

要約すると、次の 24 時間以内に ScheduleInstance.InstanceDate の ScheduleInstance が存在しない Schedule.ID のリストを取得する必要があります。

助けてくれてありがとう。

アップデート

        DateTime tomorrow = DateTime.Now.AddDays(1);
        var skeds = from sked in context.Schedules
                    join instance in context.ScheduleInstances
                         on sked.ID equals instance.ScheduleID into g
                    where (sked.StartDate <= tomorrow) &&
                          (sked.EndDate >= tomorrow) &&
                           !g.Any()
                    select sked;

これは、明日のインスタンスが存在しない場合に (ここでは関係のない後続のコードで) インスタンスが作成されるという点で機能します。StartDate を Now+2mins に設定すると、2 分後にそのスケジュールが作成されます - 完璧です。ただし、時計を 24 時間進めると、大量の新しいインスタンスが取得されるはずです。繰り返しになりますが、Schedule の開始日が今で、終了日が 30 日後の場合、最終的に 31 個のインスタンスが作成され、新しいインスタンスはそれぞれ 24 時間前に作成されます。

4

4 に答える 4

1

では、スケジュールの開始日から明日までの間に1日に1つ未満のインスタンスを持つスケジュールが必要ですか?これを実現する方法の大まかなアイデアは次のとおりです。

DateTime tomorrow = DateTime.Now.AddDays(1);
var skeds = from sked in context.Schedules
            join instance in context.ScheduleInstances
                 on sked.ID equals instance.ScheduleID into g
            let instances = g.Where(x => x.InstanceDate >= sked.StartDate &&
                                         x.InstanceDate <= tomorrow)
            where (sked.StartDate <= tomorrow) &&
                  (sked.EndDate >= tomorrow) &&
                  (instances.Count() < (tomorrow - sked.StartDate).Days)
            select sked;
于 2012-10-20T02:34:01.460 に答える
1

私はこれがトリックを行うと信じています

var today = DateTime.Now;
var nextDay = today.AddDays(1);
var scheds = from sched in context.Schedules                        
             join instance in context.ScheduleInstances
                on sched.ID equals instance.ScheduleID into schedInstances
             where (sched.StartDate >= today) && 
                   (sched.EndDate <= nextDay) &&
                   !schedInstances.Any()
             select sched.ID;
于 2012-10-19T21:39:36.593 に答える
0

これを試してください:(未テスト)

var skeds = from sked in context.Schedules
            from instance in context.ScheduleInstances
            where (sked.ID == instance.ScheduleID) && ((sked.StartDate <= DateTime.Now) && sked.EndDate >= DateTime.Now))
            select sked.ID;
于 2012-10-19T21:39:43.010 に答える
0

一方では、KISS の原則を採用する必要がありました。一方、1 つではなく 3 つのクエリがあります。しかし、それはうまくいきます!

        var instances = from inst in context.ScheduleInstances
                        where (inst.StartDateTime >= DateTime.Now)
                        && (inst.StartDateTime < tomorrow)
                        select inst;

        var skeds = from sked in context.Schedules
                    where (sked.StartDate <= DateTime.Now)
                    && (sked.EndDate >= tomorrow)
                    select sked;

        var none = from sked in skeds
                   join inst in instances
                   on sked.ID equals inst.ScheduleID
                   into tg
                   from tcheck in tg.DefaultIfEmpty()
                   where tcheck == null
                   select sked;
于 2012-10-22T18:08:40.120 に答える