Код, который вы показываете на скриншоте:
int count = dataContext.Users.Count(u => u.ID == 1 && u => u.Name == "name");
**
Это недопустимый код, и часть с **
под ним является источником ошибки.
Код, который вы показываете в теле вашего вопроса:
int count = dataContext.Users.Count(u => u.ID == 1 && u.Name == "name");
Это разные. Во-первых, это неверно, поскольку IDE указывает на вас. Последнее правильно.
Подпись используемой вами перегрузки Count
:
int Count<T>(this IEnumerable<T> source, Predicate<T> predicate);
Это означает, что для вызова на dataContext.Users
, вам необходимо предоставить Predicate<User>
. Predicate<User>
- это функция, которая отображает User
на bool
. Один из способов написать это
static bool UserPredicate(User u) {
return u.ID == 1 && u.Name == "name";
}
и тогда вы можете сказать
int count = dataContext.Users.Count(UserPredicate);
Другой способ сказать
int count = dataContext.Users.Count(
delegate(User u) { return u.ID == 1 && u.Name == "name" }
);
Это позволяет вам определять предикат в строке. Это хорошая особенность. Обратите внимание, что выражение, которое эффективно определяет предикат
u.ID == 1 && u.Name == "name"
такое же, как в случае UserPredicate
, определенного выше.
И, наконец, лямбда-выражения позволяют избавиться от этого ненужного пуха.
int count = dataContext.Users.Count(
u => f(u)
)
Где f(u)
- выражение в u
. Вы можете использовать одно выражение:
u.ID == 1 && u.Name == "name"
Опять то же выражение. Видите, ваша попытка в IDE была незаконной, потому что вы пытались написать
u.ID == 1 && u => u.Name == "name"
и это явно не является юридическим выражением.