Есть ли способ получить весь счет при использовании оператора Take?Использование Count with Take с LINQ
ответ
Вы можете сделать оба.
IEnumerable<T> query = ...complicated query;
int c = query.Count();
query = query.Take(n);
Просто выполните счет перед взятием. это вызовет выполнение запроса дважды, но я считаю, что это неизбежно.
Если это в контексте Linq2SQL, как следует из вашего комментария, это будет фактически запрашивать базу данных дважды. Что касается ленивой загрузки, хотя это будет зависеть от того, как фактически используется результат запроса.
Например: если у вас есть две таблицы говорят Product
и ProductVersion
где каждый Product
имеет несколько ProductVersions
ассоциированных с помощью внешнего ключа.
если это ваш запрос:
var query = db.Products.Where(p => complicated condition).OrderBy(p => p.Name).ThenBy(...).Select(p => p);
где вы просто выбрать Products
, но после выполнения запроса:
var results = query.ToList();//forces query execution
results[0].ProductVersions;//<-- Lazy loading occurs
, если ссылаться на любой внешний ключ или связанный с ним объект, который не был частью исходный запрос, тогда он будет ленивый загружен. В вашем случае счетчик не вызовет никакой ленивой загрузки, потому что он просто возвращает int. но в зависимости от того, что вы на самом деле делаете с результатом Take()
, у вас может возникнуть или не возникнет ленивая загрузка. Иногда бывает сложно определить, есть ли у вас LazyLoading ocurring, чтобы проверить, что вы должны регистрировать свои запросы, используя свойство DataContext.Log
.
Проще всего было бы просто сделать Count
запроса, а затем сделать Take
:
var q = ...;
var count = q.Count();
var result = q.Take(...);
Это можно сделать в одном запросе Linq-to-SQL (где будет выполняться только один оператор SQL). Сгенерированный SQL-код выглядит неприятным, так что ваше исполнение может отличаться.
Если это ваш запрос:
IQueryable<Person> yourQuery = People
.Where(x => /* complicated query .. */);
Вы можете добавить к нему следующий:
var result = yourQuery
.GroupBy (x => true) // This will match all of the rows from your query ..
.Select (g => new {
// .. so 'g', the group, will then contain all of the rows from your query.
CountAll = g.Count(),
TakeFive = g.Take(5),
// We could also query for a max value.
MaxAgeFromAll = g.Max(x => x.PersonAge)
})
.FirstOrDefault();
Который позволит вам получить доступ к данным, как так:
// Check that result is not null before access.
// If there are no records to find, then 'result' will return null (because of the grouping)
if(result != null) {
var count = result.CountAll;
var firstFiveRows = result.TakeFive;
var maxPersonAge = result.MaxAgeFromAll;
}
- 1. Linq subquery - with take
- 2. EF LINQ Include with Take
- 3. Linq join with count
- 4. Linq Count with Condition
- 5. LINQ Join (Left Outer) with Take (1)
- 6. LINQ grouping with count issue
- 7. Linq: «Против» Take?
- 8. Использование параллельных вычислений или параллельных LINQ с LINQ Take
- 9. SQL: использование count with Clob
- 10. LINQ with GROUP BY and HAVING COUNT
- 11. Linq Union и Take
- 12. Linq Take on Include?
- 13. LINQ To Entities INNER JOIN with COUNT
- 14. Linq skip, take
- 15. Linq Take() question
- 16. Scala list take with offset
- 17. GroupBy несколько столбцов в Linq с Take()
- 18. Использование Take() с анонимным типом (поставщик DB2)
- 19. Linq2Entities Include with Skip/Take-load issue
- 20. Использование Take() с привязкой источника
- 21. LINQ Использование Single with Try..Catch vs First with Count! = 1
- 22. LINQ Подзапрос после .Take (1)
- 23. Использование пользовательских атрибутов jQuery selectors with dropdown select (take 2)
- 24. Linq To Sql Пропустить Take
- 25. Услуги Linq Take and Ria
- 26. Count of count with Rails
- 27. LINQ SELECT TAKE 1 EACH ROW
- 28. RavenDB - LINQ - Count() несоответствия
- 29. «Count()» после «Take()» на «IQueryable» возвращает неправильный результат?
- 30. Take Picture with Alcatel Pop C5
если вопрос конкретно о linq2sql, вы должны пометить свой вопрос как таковой. – luke