Query is included in LINQ to Entities.

entity-framework

Question

I'm trying to use Contains() in a simple query but it is failing, with the error :

Unable to create a constant value of type 'NewsletterApp.Models.NewsletterUser'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.

Edit The intellisense actually directs me to use the NewsletterUser in Contains() -'(NewsletterUser item)'

I read that there were issues searching for an object using Contains() using EF with .NET 3.5, but I am using EF4.2 (also tried 4.1) with .NET 4.0 . Code is below:

        var db = new MyContext(); 

        var newsletterUser = db.NewsletterUsers.Find(UserID);
        var subscriberList = db.Subscribers
              .Where(x => x.NewsletterList.ListOwner.NewsletterUsers.Contains(newsletterUser))
              .ToList();
1
4
1/21/2012 11:31:32 AM

Accepted Answer

I suspect you want this

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();

Any() checks for the existence of a item that fulfils the criteria specified in the lambda: "y => y.UserId == newsletterUser.UserId".

The exception you were getting: "Only primitive types ('such as Int32, String, and Guid') are supported in this context" is due to limitations set by LINQ to Entities. LINQ to Entities needs to resolve your query in a way that it can express to the database, and it can't do that with the Contains() method with anything other than a primitive type.

The thing is, the code you posted does run fine if you run it against an in memory collection (LINQ to Objects) - that's why it isn't flagged by the compiler.

7
1/21/2012 8:31:02 AM

Popular Answer

Your query is wrong. Instead of comparing a property or field, you are comparing the whole object or entity, which can't be done in this manner.

Try the following code and it will work

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();


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow