这个lambda表达式有什么问题? “u => ...&& u => ...”

时间:2012-03-29 12:18:03

标签: c# lambda

我正在尝试在以下lambda表达式中使用逻辑运算符

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 个答案:

答案 0 :(得分:2)

屏幕截图中显示的代码是

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的情况相同。

最后,Lambda表达式允许你摆脱一些不必要的毛病。

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"

这显然不是一种法律表达。

答案 1 :(得分:0)

我尝试使用以下方法创建类似的方案:

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中是否存在可能导致此问题的某些细节?你能为repro提供更多信息吗?

编辑

在您附上的屏幕截图中,您还有一个额外的'u =&gt;'之后&amp;&amp;哪个不行。

u =&gt;在开始时使用表达式的主体,该表达式遵循=&gt;,它用于在体内操作的参数。你刚开始经过你一次,所以你不需要再做一次。

您能否提供类似的屏幕截图/附加信息:

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

相反,因为这应该表现正确吗?