2013-09-23 44 views
0

我有錯誤LINQ to Entities不支持LINQ表達式節點類型'Invoke'。LINQ表達式節點類型'Invoke'在LINQ to Entities中不受支持

var result = context.Users.Include("Roles") 
          .OrderBy(x => x.UserID) 
          .Where(x => !userIsAdmin(x)) 
          .Skip(skip) 
          .Take(take) 
          .ToList(); 

private readonly Func<User, bool> userIsAdmin = u => u.Roles.Any(y => y.Name.Equals(AdminRoleName)); 

我在哪裏寫錯了?

+0

在哪裏調用? – Amit

+0

@Amit here:'.Where(x =>!userIsAdmin(x))''。 'Where'從其lambda參數中構建表達式;在這個表達式中userIsAdmin是一個'Func',因此它被翻譯成[Expression.Invoke](https://msdn.microsoft.com/en-us/library/bb355170(v = vs.110).aspx)和EntityFramework不支持'Expression.Invoke',因爲它不知道如何將其轉換爲SQL。 –

+0

看看這個http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx – Ehsan

回答

3

LINQ to SQL和LINQ到實體都工作在Expression,而不是Func(如LINQ到對象一樣),所以你必須聲明你userIsAdminExpression<Func<User, bool>>

private readonly Expression<Func<User, bool>> userIsAdmin = u => u.Roles.Any(y => y.Name.Equals(AdminRoleName)); 

你也應該考慮改變表達式爲:

private readonly Expression<Func<User, bool>> userIsAdmin = u => u.Roles.Select(y => y.Name).Contains(AdminRoleName)); 

它應該被翻譯成IN聲明在生成的SQL查詢中。

+0

我有新的錯誤 - 名稱'userIsAdmin'在目前的情況下 – zrabzdn

+0

不存在,根本不會工作。 (x =>!userIsAdmin(x))會出錯,因爲您不能調用表達式,因爲它不是委託。 –

0

MarcinJuraszek是在正確的軌道上。您可以將謂詞更改爲:

private readonly Expression<Func<User, bool>> userIsNotAdmin = u => !u.Roles.Any(y => y.Name.Equals(AdminRoleName)); 

請注意,這是您所擁有的反演。

然後你應該能夠這樣稱呼它:

var result = context.Users.Include("Roles") 
         .OrderBy(x => x.UserID) 
         .Where(userIsNotAdmin) 
         .Skip(skip) 
         .Take(take) 
         .ToList(); 
相關問題