2012-01-21 5 views
4

Я пытаюсь использовать Содержит() в простом запросе, но это не удается, с ошибкой:LINQ к Entities Содержит запрос

Невозможно создать постоянное значение типа «NewsletterApp.Models.NewsletterUser». В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).

Редактировать IntelliSense фактически направляет меня использовать NewsletterUser в Содержит() - «(NewsletterUser пункт)»

Я читал, что там были проблемы поиска объекта с помощью Содержит(), используя EF с .NET 3.5, но я использую EF4.2 (также попытался 4.1) с .NET 4.0. Код ниже:

 var db = new MyContext(); 

     var newsletterUser = db.NewsletterUsers.Find(UserID); 
     var subscriberList = db.Subscribers 
       .Where(x => x.NewsletterList.ListOwner.NewsletterUsers.Contains(newsletterUser)) 
       .ToList(); 

ответ

7

Я подозреваю, что вы хотите, это

var db = new MyContext(); 
var newsletterUser = db.NewsletterUsers.Find(UserID); 
var subscriberList = db.Subscribers 
      .Where(x => x.NewsletterList.ListOwner.NewsletterUsers 
        .Any(y => y.UserId == newsletterUser.UserId)) 
      .ToList(); 

Любой() проверяет существование элемента, который удовлетворяет критериям, указанным в лямбда: "y => y.UserId == newsletterUser.UserId".

Исключением, которое вы получали: «В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid») из-за ограничений, установленных LINQ to Entities. LINQ to Entities должен разрешить ваш запрос таким образом, чтобы он мог выразить базу данных, и он не может сделать это с помощью метода Contains() с чем-либо, кроме примитивного типа.

Дело в том, что код, который вы опубликовали, работает нормально, если вы запускаете его в коллекции памяти (LINQ to Objects) - вот почему он не помечен компилятором.

1

Ваш запрос неверен. Вместо сравнения свойства или поля вы сравниваете весь объект или объект, что невозможно сделать таким образом.

Попробуйте следующий код и он будет работать

var db = new MyContext(); 
var newsletterUser = db.NewsletterUsers.Find(UserID); 
var subscriberList = db.Subscribers 
      .Where(x => x.NewsletterList.ListOwner.NewsletterUsers.UserId.Contains(newsletterUser.UserID)) 
      .ToList(); 
+0

NewsleterUsers - это IEnumerable, так что код не будет работать. Фактически intellisense направляет меня на использование объекта '(NewsletterUser item)'. – Judo

+0

Я мало знаю о вашем контексте, поэтому не могу точно написать точный запрос .... Можете ли вы уточнить, что вы хотите, и показать класс сущности для NewsLetter и подписчиков .... Основная причина, по которой ваш запрос isn «Работаю, потому что вы сравниваете объекты вместо свойств или полей ... Думайте об этом таким образом, можете ли вы сравнить класс1 с классом2 .... –