Entity framework LINQ to实体包含查询

Entity framework LINQ to实体包含查询,entity-framework,Entity Framework,我试图在简单查询中使用Contains(),但失败,错误如下: 无法创建类型为“newsletteApp.Models.newsletteUser”的常量值。在此上下文中仅支持基本类型(“如Int32、String和Guid”) 编辑intellisense实际上指示我在Contains()中使用新闻稿用户-(新闻稿用户项) 我了解到在.NET 3.5中使用EF搜索Contains()对象时出现问题,但我在.NET 4.0中使用EF4.2(也尝试了4.1)。 代码如下: var

我试图在简单查询中使用Contains(),但失败,错误如下:

无法创建类型为“newsletteApp.Models.newsletteUser”的常量值。在此上下文中仅支持基本类型(“如Int32、String和Guid”)

编辑intellisense实际上指示我在Contains()中使用新闻稿用户-(新闻稿用户项)

我了解到在.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();

你的问题是错误的。您不是在比较属性或字段,而是在比较整个对象或实体,这不能用这种方式完成

尝试下面的代码,它将工作

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

我怀疑你想要这个

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==newsletteUser.UserId”

您得到的异常:“在此上下文中仅支持基本类型('如Int32、String和Guid')”是由于LINQ对实体设置的限制。LINQtoEntities需要以一种可以表达到数据库的方式解析查询,而它不能用包含()方法来解析原始类型以外的任何内容


问题是,如果您针对内存中的集合(LINQ to Objects)运行您发布的代码,那么它确实可以正常运行—这就是为什么编译器不会标记它。

NewsleterUsers是一个IEnumerable,因此代码无法工作。intellisense实际指示我使用对象(用户项)“。我对您的上下文了解不多,因此无法准确地编写查询……您能否详细说明您想要什么,并为时事通讯和订阅者显示实体类……您的查询不起作用的主要原因是您正在比较对象,而不是属性或字段……请这样想,你能比较一下1班和2班吗。。。。