私はなんとかLINQで自分自身を困惑させました。LINQクエリから収集したサブセットを使用して、WPFアプリで編集可能なデータグリッドを作成しようとしています。
var LookUpEvents = from d in ThisData.Events.Local
where d.StartDate.Value.Date <= DateTime.Now.Date &&
(d.EndDate.HasValue == false || d.EndDate.Value.Date >= DateTime.Now.Date)
select d;
RangeEventGrid.ItemsSource = LookUpEvents;
RangeEventGrid.Items.Refresh();
このクエリは機能し、データグリッドにデータが入力されますが、この例外がスローされると、データグリッドを編集できません。
"'EditItem' is not allowed for this view."
at System.Windows.Controls.ItemCollection.System.ComponentModel.IEditableCollectionView.EditItem(Object item)
at System.Windows.Controls.DataGrid.EditRowItem(Object rowItem)
以下を使用して完全なデータセットをロードする場合:
ThisData.Events.Load();
FullEventGrid.ItemsSource = ThisData.Events.Local;
すべてが正常に機能し、データは編集可能です。使用されるXAMLは同一であり(バインドされたデータグリッドを交換しようとしましたが、完全な結果は編集可能なままで、クエリは例外をスローします)、これらの唯一の違いはクエリです。クエリを変更しようとすると、新しい例外が発生します。
The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
そのために使用されるクエリ:
var LookUpEvents = from d in ThisData.Events
where d.StartDate.Value.Date <= DateTime.Now.Date &&
(d.EndDate.HasValue == false || d.EndDate.Value.Date >= DateTime.Now.Date)
select d;
LookUpEvents.Load(); //Exception thrown here.
RangeEventGrid.ItemsSource = LookUpEvents;
RangeEventGrid.Items.Refresh();
その例外についての本当に奇妙なこと(少なくとも私には奇妙なこと)は、例外をスローしない他のクエリでDateTime比較を使用することです。たとえば、別の場所でのこのクエリは正常に機能します。
var LookUpSessions = from d in ThisData.Sessions
where d.EndTime.Hour >= (DateTime.Now.Hour - 1) && d.StartTime.Hour <= (DateTime.Now.Hour + 2)
&& d.Event.IsActive == true
orderby d.StartTime.Hour, d.StartTime.Minute
select d;
LINQクエリの結果をDataGridにバインドして編集することはできませんか?もしそうなら、それは大きな見落としになるようです。LINQ、WPF、EFはすべて私にとってまったく新しいものであるため、基本的なものが欠けている可能性がはるかに高いと感じています。
前もって感謝します。