2012-03-29 32 views
-4

我想在下面的lambda表达式这个lambda表达式有什么问题? “U => ... && U => ...”

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"); 
} 

我m使用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

+1

Lambda对我来说看起来不错,你确定错误在这一行吗? – Rawling 2012-03-29 12:20:59

+0

您需要在'where'语句中有表达式,然后在最后调用count()方法。 – Magrangs 2012-03-29 12:21:37

+4

@Magrangs:No:http://msdn.microsoft.com/en-us/library/bb535181.aspx – jason 2012-03-29 12:22:16

回答

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>。 A 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

谢谢Jason的详细解释。我是LINQ的新手,没有注意到这种细微差别。 – 2012-03-30 10:17:32

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 =>”的& &这将无法正常工作后的截图。

u =>在开始时用于给出表达式的正文,后面跟着=>,它是用于在正文中操作的参数。你一开始就把你传给你,所以你不需要再做一次。

你能提供类似的截屏/其他信息用:

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

代替,因为这应该正确的行为?

+0

更新了问题,请参阅详细信息。 – 2012-03-29 12:43:05

相关问题