我正在尝试在以下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提供以下设计时错误“无效的表达式术语”。知道我可能做错了吗?
我收到以下错误消息
答案 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");
相反,因为这应该表现正确吗?