Bezdepbonusu7Программирование: статьи и ответы

Вопрос

LINQ. Хотите добавить предложение where динамически. Я боюсь ввода-вывода в БД

Автор вопроса: taijiОтветов: 4

Я использую веб-API ASP.NET и шаблон репозитория.
И я хочу динамически добавлять предложение where. Нравится,

//controller
  static readonly ICustomerRepository repository = new CustomerRepository();
  //
 var result = repository.GetAll();

 if (form['name'] != null) result.Where( p => p.custName.Contains( form['name'].toString() ) );
 if (form['attribute1'] != null) result.Where( p => p.attribute1.Equals( form['attribute1'].toString() ) );
 return result;
//

ИО не боятся?

  • ИО не боятся? - Не могли бы вы перевести это предложение? Совершенно непонятно, что это значит. Daniel Hilgarth 30.08.2012
  • больше деталей / больше спецификации. чтобы предотвратить неправильное толкование, не используйте ярлыки. varg 30.08.2012
  • IOs, я имею в виду доступ к базе данных, SQL-запрос к базе данных. Я боюсь выполнять SQL несколько раз. taiji 31.08.2012

linq

Ответы

Ответ 1 · рейтинг 3 · Jon Skeet

ИО не боятся?

Не совсем понятно, что вы имеете в виду, но запрос будет отправлен в базу данных только тогда, когда вы попытаетесь его выполнить, что, предположительно, находится в каком-то коде, который вызывает ваш метод. Это не похоже на то, что он будет выполняться один раз для GetAll, затем один раз для первого предложения Where, затем один раз для второго предложения Where. Все это будет упаковано в один запрос, когда вы начнете получать данные из файла IQueryable<>.

Ответ 2 · BugFinder

Если вам нужно несколько предложений where, взгляните на этот вопрос, который я задал: Объединить запросы LinQ

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

Ответ 3 · Tigran

Если вы обращаетесь к data-base, почти всегда есть доступ IO, если нет какой-либо настройки кэширования памяти. Так что это зависит от того, как вы управляете data-base. Но в целом data-base настроен на высокопроизводительный IO доступ, поэтому, пока вы не собираетесь писать крупномасштабное приложение, лично я не стал бы беспокоиться о накладных расходах IO на простые запросы, подобные этому.

Если вы хотите оптимизировать запрос, сделав его (скажем) одним единственным запросом, вы можете найти связь между этими двумя данными и сделать InnerJoin на них.

Ответ 4 · Guffa

Запрос будет выполняться, когда вы фактически получите данные, поэтому вы можете складывать к нему условия, не заставляя его извлекать все записи из базы данных.

Однако вам нужно присвоить результат чему-то, иначе вы просто будете создавать выражения и отбрасывать их:

var result = repository.GetAll();

if (form['name'] != null) {
  result = result.Where( p => p.custName.Contains( form['name'].toString() ) );
}
if (form['attribute1'] != null) {
  result = result.Where( p => p.attribute1.Equals( form['attribute1'].toString() ) );
}
return result; // or return result.ToList();

Подумайте, хотите ли вы запустить фактический запрос в конце метода, добавив ToList, или хотите вернуть выражение, которое будет выполняться кодом, вызывающим метод.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы