Использование переменных для построения запроса LinQ?

1

Я не думаю, что это возможно, но хотелось попросить вас убедиться. В настоящее время я отлаживаю какое-то программное обеспечение, которое кто-то написал, и его немного недоделаны.

Одна часть программного обеспечения - это функция поиска, которая выполняет поиск по различным полям в базе данных, а лицо, написавшее программное обеспечение, написало большой аргумент большого дела с 21 случаем в нем 1 для каждого поля, которое пользователь может захотеть выполнить.

Можно ли уменьшить это, используя оператор case в Linq или переменную, которую я могу установить с помощью оператора case перед оператором Linq?

Пример 1 из запросов Linq: (Только в том, что меняется в каждом запросе)

var list = (from data in dc.MemberDetails
    where data.JoinDate.ToString() == searchField
    select new
        {
            data.MemberID,
            data.FirstName,
            data.Surname,
            data.Street,
            data.City,
            data.County,
            data.Postcode,
            data.MembershipCategory,
            data.Paid,
            data.ToPay
        }
).ToList();

Обновить/Изменить:

Это то, что происходит до утверждения дела:

string searchField = txt1stSearchTerm.Text;
string searchColumn = cmbFirstColumn.Text;
switch (cmbFirstColumn.SelectedIndex + 1)
{

Затем дела выполняются индексом поля со списком, в котором содержится список имен полей.

Теги:
linq

2 ответа

1

Как различаются инструкции, которые обрабатываются, являются ли они взаимоисключающими или все они ограничивают запрос каким-то образом?

Вот как вы можете иметь один или несколько фильтров для одного и того же запроса и материализоваться после применения всех фильтров.

var query = (from data in dc.MemberDetails
             select ....);

if (!String.IsNullOrEmpty(searchField))
    query = query.Where(pr => pr.JoinDate.ToString() == searchField);

if (!String.IsNullOrEmpty(otherField))
    query = query.Where(....);

return query.ToList();
1

Учитывая, что where берет предикат, вы можете передать любой метод или функцию, которая принимает MemberDetail как параметр и возвращает логическое значение, а затем переносит оператор switch внутри.

private bool IsMatch(MemberDetail detail)
{
    // The comparison goes here.
}

var list = (from data in dc.MemberDetails
    where data => this.IsMatch(data)
    select new
    {
        data.MemberID,
        data.FirstName,
        data.Surname,
        data.Street,
        data.City,
        data.County,
        data.Postcode,
        data.MembershipCategory,
        data.Paid,
        data.ToPay
    }
).ToList();

Обратите внимание, что:

  • Вы можете искать более объектно-ориентированный способ сравнения, а не использовать огромный блок переключателей.

  • Анонимный тип с десятью свойствами, которые вы используете в своем select выглядит странно. Не можете ли вы вернуть экземпляр MemberDetail? Или экземпляр его базового класса?

  • 1
    Это не будет работать с Entity Framework .. хотя, не указан, тег SQL подсказывает мне, что он использует
  • 0
    @MartinBooth: хорошая мысль, я забыл об этом. Я удалю свой ответ, если он окажется авторским.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню