1

フレームワーク 4.0 を使用しています。これは SQL Server CE 上の WPF アプリケーションで、少し制限があります。次のようなエンティティがあります。

    public class TimeEvent
    {
       public int Id
       {get; set;}
       public DateTime EventDate
       {get; set;}
       public bool CheckIn
       {get; set;}
    }

CheckInチェックイン用 ( true ) とチェックアウト用 ( false )の 2 種類のイベントがCheckInあります。各イベントは 1 日 1 回発生します。私がエンティティにlinqを使用してやりたいことは、次のようなオブジェクトのセットで終わることです:

public class Diff
{
   public DateTime Date //The date of both events
   {get; set;}
   public DateTime CheckInTime //Time of first event
   {get; set;}
   public DateTime CheckOutTime //Time of second event
   {get; set;}
   public int Hours //Difference in hours.
   { get { return (CheckOutTime - CheckInTime).Hours;} 
}

検証ルールが設定されているため、各タイプのイベントは 1 日に 1 つしか発生しません。集計関数を使用してみましたが、実際にはどこにも行きません。ありがとうございました!

4

3 に答える 3

2

タイム イベントをEventDate日付部分でグループ化します。メソッドを使用する必要があることを取得するにはEntityFunctions.TruncateTime(シンプルEventDate.Dateは Entity Framework では機能しません)。

var query = from t in db.TimeEvents
            group t by EntityFunctions.TruncateTime(t.EventDate) into g
            let checkIn = g.Min(x => x.EventDate)
            let checkOut = g.Max(x => x.EventDate)           
            select new Diff {
                Date = g.Key,
                CheckInTime = checkIn,
                CheckOutTime = checkOut                    
            };

また、サーバー側で時差を計算することもできますEntityFunctions.DiffHours(checkOut, checkIn)

于 2013-01-16T07:38:42.073 に答える
0

TimeEventあなたはs( List<TimeEvent>)のリストを持っていると思いますtimeEvents

すべての私のコードを以下に示します。

    List<TimeEvent> timeEvents = new List<TimeEvent>();

                    //dummy values.
                    DateTime now = DateTime.Now;
                    for (int i = 0; i < 8; i++)
                    {
                        timeEvents.Add(new TimeEvent() { Id = i, EventDate = now, CheckIn = false });
                        now = now.Add(TimeSpan.Parse("3:1"));
                        timeEvents.Add(new TimeEvent() { Id = i, EventDate = now, CheckIn = true });
                        now = now + TimeSpan.Parse("1");
                    }

                    //group by 
                    var dataSet = timeEvents.GroupBy(a => a.EventDate.Date);
                    List<Diff> diffs = new List<Diff>();
                    foreach (var x in dataSet) 
                    {
                        if (!(x.Count() == 1))
                        {
                            diffs.Add(new Diff() { Date = x.ElementAt(0).EventDate.Date, CheckInTime = (x.ElementAt(0).CheckIn == true) ? x.ElementAt(0).EventDate : x.ElementAt(1).EventDate, CheckOutTime = (x.ElementAt(0).CheckIn == false) ? x.ElementAt(0).EventDate : x.ElementAt(1).EventDate });

                        }

                    }

                    //diffs list is full. now you can use the diffs as you like :)
于 2013-01-16T08:46:09.370 に答える
0

作成する集計デリゲートは、EF によって SQL に変換する必要があります。あなたのデータが完全にきれいで、これで注文されたとしても、それは難しいでしょう. なぜこれを使用しないのですか。

static IEnumerable<Diff> GetDiffs(YourContext context)
{
    bool? checkedIn;
    DateTime lastDate;
    foreach (var event in context.TimeEvents.OrderBy(te => te.EventDate))
    {
        if ((checkedIn.HasValue && checkedIn.Value = !event.CheckIn) ||
                (!checkedIn.HasValue && event.CheckIn))
        {
            if (checkedIn.HasValue && !event.CheckIn)
            {
                yield return new Diff
                    {
                        CheckInTime = lastDate;
                        CheckOutTime = event.EventDate;
                    };
            }                    

            checkedIn = event.CheckIn;
            lastDate = event.EventDate;
        }
    }
}

このように、データがどこから始まるか、またはフリップフロップが正しくないかどうかは問題ではありません。私はあなたの偽のDiff.Date財産も無視しました。日の境界をつなぐチェックイン期間は処理されません。

于 2013-01-16T10:36:34.297 に答える