LINQ to Entities Contains查询

4
我正在尝试在一个简单的查询中使用Contains(),但是它失败了,并出现错误信息:
无法创建 NewsletterApp.Models.NewsletterUser 类型的常量值。只有原始类型(如 Int32、String 和 Guid)在此上下文中受支持。
Intellisense 实际上引导我在Contains() 中使用 NewsletterUser - '(NewsletterUser item)'
我读到了这样的问题:在使用.NET 3.5的EF进行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();
2个回答

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

任何()函数检查是否存在符合在lambda表达式中指定的条件的项:“y => y.UserId == newsletterUser.UserId”。
你遇到的异常:“Only primitive types ('such as Int32, String, and Guid') are supported in this context”是由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();

NewsletterUsers 是一个 IEnumerable,所以那段代码不起作用。智能感知实际上指导我使用对象 '(NewsletterUser item)'。 - Judo
我不太了解你的上下文,所以无法准确编写查询语句...你能详细说明你想要什么,并展示NewsLetter和Subscribers的实体类吗?...你的查询不起作用的主要原因是你在比较对象而不是属性或字段...可以这样想,你能比较class1和class2吗... - Pankaj Upadhyay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接