Как запросить с неизвестным количеством, где параметры в ASP.NET и C # с Linq2SQL? - PullRequest
2 голосов
/ 20 августа 2010

У меня есть GridView, использующий LinqDataSource для заполнения данных из таблицы 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 будет возвращать все записи.

В моем сеточном представлении включена подкачка.

В Table Ticket есть поле с именем TimeSpent.Я хотел бы рассчитать общую сумму TimeSpent для всех отфильтрованных билетов и отобразить ее в нижнем колонтитуле.

Я мог бы использовать Linq2SQL на gridView_DataBound, чтобы запросить ВСЕ билеты на TimeSpent.Тем не менее, я запутался, как получить общий TimeSpent при фильтрации сетки.

Я пытался получить билеты от LinqDataSourceSelectEventArgs.Result, но он вернул только общее TimeSpent для текущей страницы gridview, а не длявся таблица.

Проблема в том, что я не знаю, сколько параметров будет отображаться в событии выбора.Отдел может быть нулевым и не отображаться в WhereParameters, как и Категория.

Примерно так:

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(...)  
}

Не работает, конечно.Есть ли идея, как я мог бы решить эту проблему?Заранее спасибо!

Обновлено : я снова использовал данные, возвращенные из dsGridView в OnSelected событии, как показано ниже:

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();  
}

Ответы [ 3 ]

2 голосов
/ 20 августа 2010

Вы можете построить запрос по крупицам. Это работает, хотя и утомительно и некрасиво писать.

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 # может быть немного ошибочным, но, надеюсь, это поможет вам начать.

1 голос
/ 20 августа 2010

Начните с 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-dynamic-query-library.aspx

Если этого недостаточно, вам придется самостоятельно строить деревья выражений.Не волнуйтесь, то, что вы хотите сделать, определенно возможно.Может быть, немного сложнее, если вам придется сделать это самостоятельно.

0 голосов
/ 20 августа 2010

Если у вас есть ограниченное количество параметров в предложении 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;

Таким образом, если параметр пуст, тогда он просто сравнивает поле с собой.

...