2013-10-04 2 views
0

Сначала я разрабатываю веб-службу WCF RESTful с использованием C#, .NET Framework 4.0 и кода Entity Framework.Приложение where, использующее исключение свойств навигации

У меня есть этот код:

var users = from u in context.Users.Include("WantsToDo") 
where u.WantsToDo.Contains(context.Activities.Find(activityId)) && 
    u.Gender == genderId && 
    u.City == city && 
    u.Country == countryIsoCode 
select u; 

И я получаю это исключение Забегая:

{System.ArgumentException: Can't call the method 'MyModel.Activity Find(System.Object[])' declared for type 
'System.Data.Entity.DbSet`1[MyModel.Activity]' as an instance of type 'System.Data.Objects.ObjectQuery`1[MyModel.Activity]' 
    en System.Linq.Expressions.Expression.ValidateCallInstanceType(Type instanceType, MethodInfo method) 
    en System.Linq.Expressions.Expression.ValidateStaticOrInstanceMethod(Expression instance, MethodInfo method) 
    en System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments) 
    en System.Linq.Expressions.InstanceMethodCallExpressionN.Rewrite(Expression instance, IList`1 args) 
    en System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node) 
    en System.Data.Entity.Internal.Linq.DbQueryVisitor.VisitMethodCall(MethodCallExpression node) 
    en System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor) 
    en System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) 
    en System.Linq.Expressions.ExpressionVisitor.VisitArguments(IArgumentProvider nodes) 
    en System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node) 
    en System.Data.Entity.Internal.Linq.DbQueryVisitor.VisitMethodCall(MethodCallExpression node) 
    en System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor) 
    en System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) 
    en System.Linq.Expressions.ExpressionVisitor.VisitBinary(BinaryExpression node) 
    en System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor) 
    en System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) 
    en System.Linq.Expressions.ExpressionVisitor.VisitBinary(BinaryExpression node) 
    en System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor) 
    en System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) 
    en System.Linq.Expressions.ExpressionVisitor.VisitBinary(BinaryExpression node) 
    en System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor) 
    en System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) 
    en System.Linq.Expressions.ExpressionVisitor.VisitLambda[T](Expression`1 node) 
    en System.Linq.Expressions.Expression`1.Accept(ExpressionVisitor visitor) 
    en System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) 
    en System.Linq.Expressions.ExpressionVisitor.VisitUnary(UnaryExpression node) 
    en System.Linq.Expressions.UnaryExpression.Accept(ExpressionVisitor visitor) 
    en System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) 
    en System.Linq.Expressions.ExpressionVisitor.VisitArguments(IArgumentProvider nodes) 
    en System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node) 
    en System.Data.Entity.Internal.Linq.DbQueryVisitor.VisitMethodCall(MethodCallExpression node) 
    en System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor) 
    en System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) 
    en System.Data.Entity.Internal.Linq.DbQueryProvider.CreateObjectQuery(Expression expression) 
    en System.Data.Entity.Internal.Linq.DbQueryProvider.CreateQuery[TElement](Expression expression) 
    en System.Linq.Queryable.Where[TSource](IQueryable`1 source, Expression`1 predicate) 

var users = from u in context.Users.Include("WantsToDo") 
where u.WantsToDo.Contains(context.Activities.Find(activityId)) && 
    u.Gender == genderId && 
    u.City == city && 
    u.Country == countryIsoCode 
select u; 

здесь: u.WantsToDo.Contains(context.Activities.Find(activityId)).

Это мой User класс:

[DataContract] 
public class User 
{ 
    [DataMember] 
    public int UserId { get; set; } 

    [DataMember] 
    public bool? Active { get; set; } 

    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public int? Gender { get; set; } 

    [DataMember] 
    public string Birthday { get; set; } 

    [DataMember] 
    public string Email { get; set; } 

    [DataMember] 
    public string City { get; set; } 

    [DataMember] 
    public string Country { get; set; } 

    public virtual ICollection<Activity> WantsToDo { get; set; } 
} 

Почему я получаю эту ошибку?

ответ

1

Это, как я исправил мою проблему:

var users = from u in context.Users 
from act in u.WantsToDo 
where act.ActivityId == activityId && 
    u.Gender == genderId && 
    u.City == city && 
    u.Country == countryIsoCode 
select u; 
0

Попробуйте

var users = from u in context.Users 
where u.WantsToDo.Any(e => e.ActivityId == activityId) && 
    u.Gender == genderId && 
    u.City == city && 
    u.Country == countryIsoCode 
select u; 
Смежные вопросы