我正在尝试在简单查询中使用Contains(),但它失败了,错误是:
无法创建“NewsletterApp.Models.NewsletterUser”类型的常量值。在此上下文中仅支持原始类型(例如Int32,String和Guid')。
编辑intellisense实际上指示我在Contains()中使用NewsletterUser - '(NewsletterUser item)'
我读到使用EF和.NET 3.5使用Contains()搜索对象时出现问题,但我在.NET 4.0中使用EF4.2(也尝试过4.1)。 代码如下:
var db = new MyContext();
var newsletterUser = db.NewsletterUsers.Find(UserID);
var subscriberList = db.Subscribers
.Where(x => x.NewsletterList.ListOwner.NewsletterUsers.Contains(newsletterUser))
.ToList();
答案 0 :(得分: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();
Any()检查是否存在满足lambda中指定条件的项目:“y => y.UserId == newsletterUser.UserId”。
您获得的异常:“在此上下文中仅支持基本类型(例如Int32,String和Guid')”是由于LINQ to Entities设置的限制。 LINQ to Entities需要以一种它可以表达给数据库的方式来解析你的查询,并且它不能用Contains()方法用基本类型之外的任何东西来做。
问题是,如果您针对内存集合(LINQ to Objects)运行它,那么您发布的代码运行正常 - 这就是编译器没有标记它的原因。
答案 1 :(得分: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();