2012-03-29 48 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

相關問題