首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架-多对多子查询

实体框架-多对多子查询
EN

Stack Overflow用户
提问于 2010-05-15 06:50:30
回答 2查看 1.6K关注 0票数 0

我之前问过一个关于这方面的问题,但我的数据库结构已经改变了,虽然它让其他事情变得更简单,但现在这部分更复杂了。Here是上一个问题。

当时,我的EF上下文有一个UsersProjects对象,因为还有其他属性。现在我已经简化了这个表,它只是键,所以我的EF上下文所知道的只有UsersProjects以及它们之间的M2M关系。据EF所知,没有更多的UsersProjects

所以我的目标是说:“向我展示所有与我一起工作的用户。”

在SQL中,这应该是这样的:

代码语言:javascript
运行
复制
SELECT * FROM Users INNER JOIN UsersProjects ON Users.ID=UsersProjects.UserID
WHERE ProjectID IN (SELECT ProjectID FROM UsersProjects WHERE UserID=@UserID)

我在EF开始的时候是这样的:

代码语言:javascript
运行
复制
            var myProjects =
                (from p in edmx.Projects
                 where p.Users.Contains(edmx.Users.FirstOrDefault(u => u.Email == UserEmail))
                 orderby p.Name
                 select p).ToList();

            var associatedUsers =
                (from u in edmx.Users
                 where myProjects.Contains(?????????)
                 //where myProjects.Any(????????)
                 select u);

诀窍是找到要放在?中的内容。有人来帮忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-15 07:28:22

代码语言:javascript
运行
复制
var me = context
    .Users
    .First(user => user.Email = "me@example.com");

// Note that there is no call to ToList() or AsEnumerable().
var myProjects = context
    .Projects
    .Where(project => project.Users.Contains(me));

var associatedUsers = context
    .Users
    .Where(user => myProjects.Any(project => user.Project.Contains(project)));

但还有其他几种可能的解决方案。例如

代码语言:javascript
运行
复制
var associatedUsers = myProjects
    .SelectMany(project => project.Users)
    .Distinct();

我更喜欢这样。

进一步注意,使用导航属性获取myProjects要比使用Contains()容易得多。

代码语言:javascript
运行
复制
var myProjects = me.Projects;
票数 0
EN

Stack Overflow用户

发布于 2010-05-16 04:07:10

丹尼尔,我试过你的方法,但遇到了一些问题。你能解释这些错误是什么意思吗?

我试过了:

代码语言:javascript
运行
复制
        // Doesn't work.
        using (var edmx = new MayflyEntities())
        {
            var me = edmx.Users.First(user => user.Email == UserEmail);
            var myProjects = edmx.Projects.Where(project => project.Users.Contains(me));
            var associatedUsers = myProjects.SelectMany(project => project.Users).Distinct();
        }

但得到了以下两个异常:

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

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

所以,我移动了一些东西,这很好用,但现在我很好奇为什么?在SQL Profiler中,所有操作都在一个查询中执行,那么为什么它会显示上下文已被释放呢?另外,为什么它不能使用me对象而不是lambda呢?

代码语言:javascript
运行
复制
        // Works fine
        var edmx = new MayflyEntities();
        var myProjects = edmx.Projects.Where(project => project.Users.Contains(edmx.Users.First(user => user.Email == UserEmail)));
        var associatedUsers = myProjects.SelectMany(project => project.Users).Distinct();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2838130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档