Лямбда-выражение для подсчета отдельных строк в таблице

Я пытаюсь переключиться с Linq на лямбда-выражение. Я хочу подсчитать количество различных строк в моей таблице.

Есть ли лучший способ получить его, чем тот, что ниже?

 var count = _db.myTable
     .Where(i=>i.DATE.HasValue && i.DATE==DateFrom)
     .AsEnumerable()
     .Select(x=>x.myTable_ID)
     .Distinct()
     .Count();

person Giota B    schedule 08.07.2014    source источник
comment
Ну, я бы поместил код в несколько строк, но кроме этого... что лучше вы ищете? (Вы уверены, что вам нужен вызов AsEnumerable()?)   -  person Jon Skeet    schedule 08.07.2014
comment
Я не знаю!! Вот почему я спрашиваю. Вот как я нашел это в Интернете, и, похоже, он работает, но я не уверен, что это оптимальный способ, и я просматриваю довольно много строк.   -  person Giota B    schedule 08.07.2014
comment
@GiotaB Если у вас возникли проблемы с преобразованием его в Lambda, проверьте LINQPad. Когда вы вводите выражение запроса linq, оно будет иметь вкладку результатов, содержащую выражение в виде лямбда.   -  person Silvermind    schedule 08.07.2014


Ответы (1)


Я пытаюсь переключиться с Linq на лямбда-выражение.

Непонятно, что вы имеете в виду, но лямбда-форма по-прежнему использует LINQ - если вы имеете в виду, что раньше у вас было выражение запроса, стоит знать, что выражения запроса просто преобразуются компилятором в код выражения запроса.

Что касается вашего фактического запроса, вы должны избавиться от вызова AsEnumerable(), так как в противном случае вы будете выполнять все после этого в своем процессе .NET, а не запрашивать это у базы данных. Так просто:

var count = _db.myTable
     .Where(i => i.DATE.HasValue && i.DATE == DateFrom)
     .Select(x => x.myTable_ID)
     .Distinct()
     .Count();

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

Вы также должны увидеть, действительно ли вам нужна проверка i.DATE.HasValue - я подозреваю, что нет, поскольку, если DateFrom не может быть нулевым, он все равно будет соответствовать только ненулевым значениям DATE.

person Jon Skeet    schedule 08.07.2014
comment
До сих пор я использовал синтаксис Linq, а теперь меня попросили начать писать, используя только лямбду. Я также уверен, что мне нужен i.DATE.HasValue, потому что это параметр в моем методе, и он может быть нулевым DateTime? DateFrom - person Giota B; 08.07.2014
comment
@GiotaB: Если он равен нулю, он ничему не будет соответствовать, так почему вы хотите, чтобы параметр мог принимать значение null? - person Jon Skeet; 08.07.2014
comment
Программа нацелена на синхронизацию 2 БД. Он должен запускаться через день и получать данные 2 дня назад. Но в первый раз он должен получить все. - person Giota B; 08.07.2014
comment
@GiotaB: Значит, предположительно задействованы два разных запроса? В этом случае вы можете использовать DateTime concreteDate = DateFrom.Value;, а затем просто .Where(i => i.DATE == concreteDate) в запросе. - person Jon Skeet; 08.07.2014
comment
Ты прав. Мне не нужно i.DATE.HasValue, потому что DateFrom всегда будет иметь значение. При первом запуске приложения пользователь укажет дату (даже если это 01.01.1900), после чего дата будет рассчитываться как DateFrom = DateTime.Now.AddDays(-numberOfDaysToSkip), где numberOfDaysToSkip — это константа 2, полученная из файла конфигурации. Кстати, есть один метод myMethod(DateTime? DateFrom), выполняющий один запрос... - person Giota B; 08.07.2014