Что не так с этим лямбда-выражением? "u => ... && u => ..." - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь использовать логические операторы в следующем лямбда-выражении

int count = dataContext.Users.Count(u => u.ID == 1 && u.Name == "name");

ниже приведена полная функция

private void Login(int id, string password)
{
    MyDataContext dataContext = new MyDataContext();
    int count = dataContext.Users.Count(u => u.ID == 1 && u.Name == "name");
}

Я использую Microsoft SQL Server 2008 Express 2008 Edition иТаблица пользователей выглядит как

ID int autogenerated
Name string

, но Visual Studio 2010 выдает следующие ошибки времени разработки "Недопустимые термины выражения".Любая идея, что я могу делать неправильно?

Я получаю следующие сообщения об ошибках

  • Ошибка 2) ожидается ... \ FormAdd.cs 105 123
  • Ошибка3;ожидается ... \ FormAdd.cs 105 126
  • Ошибка 5;ожидается ... \ FormAdd.cs 105 158
  • Ошибка 7;Ожидается ... \ FormAdd.cs 105 202
  • Ошибка 4 Недопустимый термин выражения ')' ... \ FormAdd.cs 105 158
  • Ошибка 6 Недопустимый термин выражения ')' ...\ FormAdd.cs 105 202
  • Ошибка 1 Недопустимый термин выражения '=>' ... \ FormAdd.cs 105 123

Intellisense doesn't show user object properties

List of Errors

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Код, который вы показываете на скриншоте:

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"

и это явно не является юридическим выражением.

0 голосов
/ 29 марта 2012

Я попытался создать похожий сценарий со следующим:

class Program
{
    static void Main(string[] args)
    {
        var userList = new List<Users>();
        Enumerable.Range(0, 100).ToList().ForEach(x => userList.Add(new Users() { ID = x, Name = "Bob" }));

        int count = userList.Count(u => u.ID == 1 && u.Name == "Bob");

        Console.WriteLine(count);
        Console.ReadKey();
    }
}

public class Users
{
    public int ID { get; set; }
    public string Name { get; set; }
}

, и у меня нет проблем.Есть какие-то особенности в dataContext.Users, которые могут быть причиной этого?Не могли бы вы предоставить больше информации для репродукции?

edit:

На прикрепленных скриншотах у вас есть дополнительное 'u =>' после выигравшего &&, который выигралне работает

u => используется в начале, чтобы дать тело выражения, которое следует за =>, параметрами, которые оно использует для работы в теле.Вы передаете u один раз в начале, поэтому вам не нужно делать это снова.

Не могли бы вы предоставить аналогичные снимки экрана / дополнительную информацию с:

int count = this.dataContext.Users.Count(u => u.ID && u.Name == "name");

вместо этого, как этодолжен вести себя правильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...