C # linq - изменить выбранное поле во время выполнения - PullRequest
3 голосов
/ 23 января 2012

У меня есть объект Заказы (Заказ, Товар, Стоимость, Цена, Клиент, День). Я извлекаю много записей из базы данных, и для облегчения фильтрации мне нужно накапливать списки DropDownList с извлеченными различными значениями, чтобы пользователь мог выбирать только конкретные даты или конкретные продукты или даже конкретную цену. Идентификаторы DropDownList создаются как «ddl_» + имя соответствующего поля.

Мне бы хотелось, чтобы можно было определить простой массив следующим образом:

public string[] filterArray = new string[] { "Order", "Product", "Cost", "Price", "Client", "Day" };

Затем вызовите метод BindDLLs:

foreach (string filterName in filterArray)
{
    // Find the ddl to populate
    DropDownList ddl = (DropDownList)this.FindControl("ddl_" + filterName);
    // Get the data for that ddl only (use filterName in the select...)
    var query = (from items in results select items.filterName.ToString()).Distinct();

    // Populate the ddl (not complete code...)
    foreach (var item in query)
    {
        ddl.Items.Add(item...);
    }
}

Моя проблема в том, что я нахожу много документации о том, как изменить WHERE или GROUP BY или любые другие части операторов linq во время выполнения. Я просто не могу найти информацию о том, как динамически изменить поле, которое я хочу получить.

Есть ли простой способ сделать это? Спасибо. Yipi

Edit:

List<Orders> results = OrdersService.GetOrders();

public class Orders
{
    [DataMember]
    public DateTime? Day
    [DataMember]
    public int? Order
    [DataMember]
    public int? Product
    [DataMember]
    public int? Cost
    [DataMember]
    public int? Price
    [DataMember]
    public int? Client
    [DataMember]
}

Ответы [ 2 ]

2 голосов
/ 23 января 2012

Эту проблему можно решить, построив лямбда-выражение вручную.

Используемый в настоящее время запрос может быть изменен для использования синтаксиса цепочек методов и будет выглядеть следующим образом:

var query = results.Select(item => item.<filterName>.ToString()).Distinct();

Теперь нам нужно создать лямбда-выражение, которое передается Distinct самим.

Это может быть достигнуто с помощью следующего метода:

Expression<Func<YourResultType, string>> CreateExpression(string propertyName)
{
    var itemExpression = Expression.Parameter(typeof(YourResultType), "item");
    var propertyExpression = Expression.Property(itemExpression, propertyName);
    var toStringExpression = Expression.Call(propertyExpression,
                                             "ToString", null);
    return Expression.Lambda<Func<YourResultType, string>>(toStringExpression, 
                                                           itemExpression);
}

Теперь мы можем изменить запрос следующим образом:

var query = results.Select(CreateExpression(filterName)).Distinct();

Обратите внимание, что вам нужно изменить YourResultType на тип экземпляров в вашей переменной results. Кроме того, если вы запрашиваете не базу данных, а список в памяти, вам нужно изменить запрос следующим образом:

var query = results.Select(CreateExpression(filterName).Compile()).Distinct();
0 голосов
/ 23 января 2012
...