2

我有一个 GridViewLinqDataSource用于从表中填充数据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 将返回所有记录。

我的 gridview 启用了分页。

Table Ticket 有一个名为 的字段TimeSpent。我想计算TimeSpent所有过滤的票的总数并将其显示在页脚上。

我可以使用Linq2SQLongridView_DataBound来查询所有门票的 TimeSpent。但是,我很困惑如何在过滤 gridview 时获得总 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 更适合您: http ://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the- linq-动态-查询-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 回答