我之前问过一个关于这方面的问题,但我的数据库结构已经改变了,虽然它让其他事情变得更简单,但现在这部分更复杂了。Here是上一个问题。
当时,我的EF上下文有一个UsersProjects对象,因为还有其他属性。现在我已经简化了这个表,它只是键,所以我的EF上下文所知道的只有Users
和Projects
以及它们之间的M2M关系。据EF所知,没有更多的UsersProjects
。
所以我的目标是说:“向我展示所有与我一起工作的用户。”
在SQL中,这应该是这样的:
SELECT * FROM Users INNER JOIN UsersProjects ON Users.ID=UsersProjects.UserID
WHERE ProjectID IN (SELECT ProjectID FROM UsersProjects WHERE UserID=@UserID)
我在EF开始的时候是这样的:
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);
诀窍是找到要放在?中的内容。有人来帮忙吗?
发布于 2010-05-15 07:28:22
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)));
但还有其他几种可能的解决方案。例如
var associatedUsers = myProjects
.SelectMany(project => project.Users)
.Distinct();
我更喜欢这样。
进一步注意,使用导航属性获取myProjects
要比使用Contains()
容易得多。
var myProjects = me.Projects;
发布于 2010-05-16 04:07:10
丹尼尔,我试过你的方法,但遇到了一些问题。你能解释这些错误是什么意思吗?
我试过了:
// 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呢?
// 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();
https://stackoverflow.com/questions/2838130
复制相似问题