У меня есть много уродливого код, который выглядит следующим образом:Как бы вы реорганизовали этот код LINQ?
if (!string.IsNullOrEmpty(ddlFileName.SelectedItem.Text))
results = results.Where(x => x.FileName.Contains(ddlFileName.SelectedValue));
if (chkFileName.Checked)
results = results.Where(x => x.FileName == null);
if (!string.IsNullOrEmpty(ddlIPAddress.SelectedItem.Text))
results = results.Where(x => x.IpAddress.Contains(ddlIPAddress.SelectedValue));
if (chkIPAddress.Checked)
results = results.Where(x => x.IpAddress == null);
...etc.
results
является IQueryable<MyObject>
.
Идея заключается в том, что для каждого из этих бесчисленных выпадающих списков и флажков, если выпадающее меню имеет что-то выбранное, пользователь хочет сопоставить этот элемент. Если флажок установлен, пользователю нужны именно те записи, где это поле имеет нулевую или пустую строку. (Пользовательский интерфейс не позволяет одновременно выбирать оба варианта.) Все это добавляет выражение LINQ, которое запускается в конце, после того, как мы добавили все условия.
Это кажется как там должен быть какой-то способ вытащить Expression<Func<MyObject, bool>>
или два, так что я могу поставить повторяющиеся части в методе и просто передать в какие изменения. Я сделал это в других местах, но этот набор кода заставил меня замолчать. (Кроме того, я бы хотел избежать «Динамического LINQ», потому что я хочу, чтобы по возможности хранить вещи безопасными по типу.) Любые идеи?
Имейте в виду, что это LINQ to SQL (что я не сказал в вопросе, но это один из тегов). Я хочу, чтобы фильтрация выполнялась на стороне базы данных, а не на стороне клиента. – 2008-09-30 01:42:39