2013-02-13 40 views
1

我是新的Linq并找不到类似的主题。 我只想显示当前已通过身份验证的用户所在的组织。Linq通过多个对象类

我有以下的LINQ,但返回的组织是不正确的:

OrganizationList.DataSource = from i in Database<Organization>.Linq() 
where (i.Users.Select(y => y.User.Id).Contains(user_id)) 
select i; 

这里是类:

public class Organization 
{ 
    int Id 
    string Name 
    IList<OrganizationUser> Users 
    [...] 
} 

OrganizationUser 
{ 
    int Id 
    User User 
    Organization Organization 
    [...] 
} 

User 
{ 
    int Id 
    string FirstName 
    string LastName 
    [...] 
} 

假设:

Database<TEntity> where TEntity : class 

user_id是验证当前用户ID

我使用NHibernate

我不能修改类的,所以OrganizationUser必须使用。

你能帮我吗?


编辑: 非常感谢您的帮助!

这两种解决方案都工作:

OrganizationList.DataSource = Database<Organization>.Linq() 
          .Where(o => o.Users.Any(u => u.User.Id == user_id)); 


OrganizationList.DataSource = from i in Database<Organization>.Linq() 
           where (i.Users.Any(y => y.User.Id == user_id) 
           select i; 

感谢名单再次:)

+3

** **如何是不正确的结果。除了'你能帮我吗?',我没有看到问题吗? – LukeHennerley 2013-02-13 10:53:41

回答

0

我没有测试它的机会,但下面可能工作;

OrganizationList.DataSource = from i in Database<Organization>.Linq() 
where (i.Users.Any(y => y.User.Id == user_id) 
select i; 
+0

这应该会产生与OP已具有的查询相同的结果。 – 2013-02-13 10:58:14

+0

@DanielHilgarth实际上,这是比较user_id和'User'表中的'ID',而OP将它与'OrganizationUser'表中的'ID'进行比较。这些ID很可能不同。 – juharr 2013-02-13 11:11:19

+0

@juharr:这是不正确的。请再检查一次。这两个查询都以“组织”开始,然后继续到“用户”,最后是“用户”。 – 2013-02-13 11:13:51

0

怎么样,

var organizationsWithUser = Database<Organization>.Linq() 
          .Where(o => o.Users.Any(u => u.User.Id == user_id)); 
+0

这应该会产生与OP已具有的查询相同的结果。 – 2013-02-13 10:58:34

+0

该解决方案适用于小改动:.Any(u => u.User.Id == user_id) – KevinM 2013-02-13 13:24:58