Не совсем понятно, что вы имеете в виду, но запрос будет отправлен в базу данных только тогда, когда вы попытаетесь его выполнить, что, предположительно, находится в каком-то коде, который вызывает ваш метод. Это не похоже на то, что он будет выполняться один раз для 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, или хотите вернуть выражение, которое будет выполняться кодом, вызывающим метод.