LINQ to Entities包含查询

时间:2012-01-21 06:43:59

标签: entity-framework

我正在尝试在简单查询中使用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();

2 个答案:

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