2

LinqDataSourcetable からデータを入力するために使用する GridView がありますTicketsLinqDataSourceには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 にすることができます。

グリッドビューでページングが有効になっています。

テーブル チケットには というフィールドがありますTimeSpentTimeSpentフィルタリングされたすべてのチケットの合計を計算し、フッターに表示したいと思います。

Linq2SQLonを使用し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();  
}
4

3 に答える 3

2

クエリを少しずつ作成できます。書くのは面倒で醜いですが、機能します。

TicketsDataContext db = new TicketsDataContext();
var query = from ticket in db.Tickets select ticket;

If (param.Name == "Department"){
    if (!string.IsNullOrEmpty(param.Value)){
        query = query.Where(c => c.Department == param.Value);
     }
}

If (param.Name == "Category"){
    if (!string.IsNullOrEmpty(param.Value)){
        query = query.Where(c => c.Category == param.Value);
    }
}

が有効かどうか、param.Name私の C# が少し間違っているかどうかはわかりませんが、うまくいけば、それで始めることができます。

于 2010-08-20T15:47:40.237 に答える
1

http://www.albahari.com/nutshell/predicatebuilder.aspx から始めます。それらは PredicateBuilder に入ります。これは、遭遇するほとんどのシナリオに適しています。最終的には式ツリーを掘り下げる必要があるかもしれませんが、それはかなり高度な作業です。

以下のコメントから、Dynamic Linq の方が適しているように思えます 。 linq-dynamic-query-library.aspx

これで十分でない場合は、自分で式ツリーを構築する必要があります。心配しないでください。やりたいことは必ず実現できます。自分でやらなければならない場合は、少しトリッキーになるかもしれません。

于 2010-08-20T15:14:35.187 に答える
0

where句のパラメータ数が限られている場合は、次のことができます。

TicketsDataContext db = new TicketsDataContext();
var query = from ticket in db.Tickets 
            where ticket.Department == (!string.IsNullOrEmpty(DepartmentParam.Value) ? DepartmentParam.Value : ticket.Department) &&
                  ticker.Category == (!string.IsNullOrEmpty(CategoryParam.Value) ? CategoryParam.Value : ticket.Category)
            select ticket;

そのようにして、パラメーターが空白の場合、フィールドをそれ自体と単純に比較します。

于 2010-08-20T16:04:59.040 に答える