Один пример, с которым я столкнулся сегодня:
ObjectSet<User> users = context.Users;
var usersThatMatch = criteria.Aggregate(users, (u, c) => u.Where(c));
Приведенный выше код не будет работать, поскольку метод .Where не возвращает ObjectSet<User>
. Вы можете обойти это одним из двух способов. Я мог бы вызвать .AsQueryable()
для пользователей, чтобы убедиться, что он строго типизирован как IQueryable, или я мог бы передать аргументы определенного типа в метод Aggregate:
criteria.Aggregate<Func<User, bool>, IEnumerable<User>>(
PersonSet, (u, c) => u.Where(c));
Другая пара более распространенных примеров - это методы Cast
и OfType
, которые не могут определить, какой тип вам нужен, и во многих случаях в первую очередь вызываются для неуниверсальной коллекции.
В общем, люди, которые разрабатывали методы LINQ, старались изо всех сил избегать необходимости использовать явные типы в этих универсальных методах, и по большей части вам это не нужно. Я бы сказал, что лучше знать, что это вариант, но избегайте этого, если не считаете это необходимым.