Я не думаю, что это возможно, но хотелось попросить вас убедиться. В настоящее время я отлаживаю какое-то программное обеспечение, которое кто-то написал, и его немного недоделаны.
Одна часть программного обеспечения - это функция поиска, которая выполняет поиск по различным полям в базе данных, а лицо, написавшее программное обеспечение, написало большой аргумент большого дела с 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)
{
Затем дела выполняются индексом поля со списком, в котором содержится список имен полей.
Как различаются инструкции, которые обрабатываются, являются ли они взаимоисключающими или все они ограничивают запрос каким-то образом?
Вот как вы можете иметь один или несколько фильтров для одного и того же запроса и материализоваться после применения всех фильтров.
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();
Учитывая, что 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
? Или экземпляр его базового класса?