LinqDataSource
table からデータを入力するために使用する GridView がありますTickets
。LinqDataSource
にはAutoGenerateWhereClause="True"
、where 句を次のように動的に構築できるようにするための機能があります。
<asp:LinqDataSource ID="dsGridView" runat="server" AutoGenerateWhereClause="True"
ontextTypeName="TicketsDataContext" TableName="Tickets" OrderBy="ID Descending"
EnableDelete="True" OnSelecting="dsGridView_Selecting">
<WhereParameters>
<asp:SessionParameter Name="AssignedTo" SessionField="user"/>
<asp:Parameter Name="Department" DefaultValue="" />
<asp:Parameter Name="Category" DefaultValue="" />
</WhereParameters>
</asp:LinqDataSource>
Where パラメーターは、グリッドビューのヘッダーのドロップダウン リスト フィルターと共に使用されます。dsGridView がすべてのレコードを返すように、null にすることができます。
グリッドビューでページングが有効になっています。
テーブル チケットには というフィールドがありますTimeSpent
。TimeSpent
フィルタリングされたすべてのチケットの合計を計算し、フッターに表示したいと思います。
Linq2SQL
onを使用しgridView_DataBound
て、すべてのチケットの TimeSpent を照会できます。ただし、グリッドビューがフィルター処理されたときに合計 TimeSpent を取得する方法がわかりません。
からチケットを取得しようとしましLinqDataSourceSelectEventArgs.Result
たが、テーブル全体ではなく、gridview の現在のページの合計 TimeSpent のみが返されました。
問題は、Selecting イベントでいくつの Where パラメータが表示されるかわからないことです。Department は null で、WhereParameters に表示されない可能性があり、Category も同様です。
このようなもの:
TicketsDataContext db = new TicketsDataContext();
var query = from ticket in db.Tickets select ticket;
foreach (var param in dsGridView.WhereParameters
{
if (!string.IsNullOrEmpty(param.Value))
query.query.Where(...)
}
もちろん機能しません。この問題にどのように取り組むことができるか考えていますか? 前もって感謝します!
更新OnSelected
:以下のように、イベントで dsGridView から返されたデータを再利用することになりました。
protected void dsGridView_Selected(Object sender, LinqDataSourceStatusEventArgs e)
{
var totalTime = (e.Result as List<Ticket>).Sum(t => t.TimeSpent);
grvTickets.Columns[7].FooterText = "Sum: " + totalTime.ToString();
}