0

私のアプリケーションには組み込みのカレンダー システムがあり、それらのデータベース スキーマは次のようになります。

CalendarItem( CalendarItemId bigint, Start datetime, Length int, Blargh nvarchar(MAX) )

Startはイベント開始時の UTC 日時値Lengthで、イベントの長さ (秒単位) です。終日イベントは 0000h から始まり、長さは 86400 です。

Entity Framework で Linq を使用しており、日付範囲内にあるイベントを見つけたいと考えています。2 つの日時の間に開始するイベントを見つけるのは簡単ですが、2 つの日時の間に終了するイベントを見つける方法がわかりません。

これが私の現在のコードです:

public IEnumerable<CalendarItem> GetCalendarItems(DateTime from, DateTime to) {

    var events = from c in db.CalendarItems
                 where c.Start >= from && c.Start <= to
                 orderby c.Start
                 select c;

    return events;
}

T-SQL を使用している場合は、秒DATEADDを追加して日時を指定する必要がありますが、これは機能しますが、Linq でこれを行うことはできないと思います。私に何ができる?LengthStartEnd

4

3 に答える 3

2

ToList() 関数を含む編集:

私がこれを正しく読んでいるなら、あなたは望むでしょう:

var events = (from c in db.CalendarItems
             where c.Start >= from && c.Start <= to
             orderby c.Start
             select c).ToList();
events = events.Where(e => e.Start.AddSeconds(Length) <= to);

return events;

これにより、指定された日付範囲内に開始および終了したイベントが表示されます。

DateTime.AddSeconds() の詳細については、このリンクにアクセスしてください。

于 2013-01-07T02:30:47.260 に答える
1

ToList()関数を使用する前に、まず呼び出す必要がありDateTime.AddSecondsます。AddSecondsそうしないと、コンパイラは、LINQ クエリが SQL に変換され、SQL にこの関数が含まれていないため、関数が見つからないと文句を言いDateTime.AddSecondsます。

var events = (from c in db.CalendarItems
             where c.Start >= from && c.Start <= to
             orderby c.Start
             select c).ToList();
events = events.Where(e => e.Start.AddSeconds(Length) <= to);
return events;

編集:私の論理を修正しました。答えはIronMan84のものと同じになりました。

于 2013-01-07T02:30:07.713 に答える
0

私はアプローチを評価しました.ToListが、(開始または終了したかどうかに関係なく) 発生したイベントを返すように変更した後、データベースから多くの無関係な結果をフェッチするため、非効率的です。

SqlFunctions メソッドも調べましたが、EF1.0 にはありません。

エンティティ コンテキストで厳密に型指定されたインポートで Sproc を使用することになりました。完璧ではありませんが、他の方法よりは優れています。

最終的にプロジェクトが .NET4 にアップグレードされたら、SqlFunctions に切り替えます。とにかくすべてのアドバイスをありがとう!

于 2013-01-07T06:38:16.533 に答える