2012-01-13 99 views
1

我有这个POCO,我想返回特定公司的用户列表。EF 4.1 POCO查询

public class Company 
{ 
    public AccreditedCompany() 
    { 
     this.Branches = new HashSet<Branch>(); 
    } 

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), ScaffoldColumn(false)] 
    public int CompanyId { get; set; } 
    public bool Active { get; set; } 

    public virtual ICollection<Branch> Branches { get; set; }   
} 

public class Branch 
{ 
    public Branch() 
    { 
     this.Users = new HashSet<User>(); 
    } 

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), ScaffoldColumn(false)] 
    public int BranchId { get; set; } 
    public int CompanyId { get; set; } 
    public string Name { get; set; } 
    public string ContactName { get; set; } 

    public virtual Company Company { get; set;} 
    public virtual ICollection<User> Users { get; set; } 
} 

public class User 
{ 

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), ScaffoldColumn(false)] 
    public int UserId { get; set; } 
    public int BranchId { get; set; } 
    public string ComputerSN { get; set; } 
    public string CameraSN { get; set; } 

    public virtual Branch Branch { get; set; }   
} 

这是我的LINQ查询:

var company = (from u in objDataContext.Companies.Include(c=>c.Branches.Select(v=>v.Users)) 
    where u.CompanyId == 8 select u).FirstOrDefault(); 

IQueryable<User> users = (from j in company.Branches select j.Users); 

我对第二个查询此编译错误:

错误2无法隐式转换类型 “System.Collections.Generic。 IEnumerable>' 改为'System.Linq.IQueryable'。一个显式转换存在(被 缺少强制转换?)

我想获得用户的列表,类似于普通的SQL语句等预先

SELECT dbo.Users.* FROM Branches 
INNER JOIN dbo.Users ON dbo.Branches.BranchId = dbo.Users.BranchId 
INNER JOIN dbo.Companies ON dbo.Branches.CompanyId = dbo.Companies.CompanyId 
WHERE  (dbo.Companies.CompanyId = 8) 

感谢。

+0

值得一提的是,您的SQL查询可以简化为:'选择dbo.Users * FROM分行 INNER JOIN dbo.Users ON dbo.Branches.BranchId = dbo.Users.BranchId WHERE dbo.Branches.CompanyId = 8 “你根本不需要加入公司。 – 2012-01-13 18:46:58

回答

3

您的用户查询可以是:

IEnumerable<User> users = company.Branches.SelectMany(branch => branch.Users); 

这将返回所有用户在该公司的任何分支。

+1

在这种情况下,您仍需要查询才能获得目标公司。 因为分支对象已经可以访问companyID,所以您并不需要牵涉到公司。从分支开始查询并避免在生成的SQL查询中进行连接。 – Patrick 2012-01-13 18:32:17

0

它看起来对我来说,你可以只使用:

IQueryable<User> users = objDataContext.Users 
         .Where(u => u.Branch.CompanyId == 8); 

我注意到你有你的Branch实体都CompanyCompanyId,虽然。这似乎是多余的,尽管它稍微简化了这个查询。你应该能够摆脱Branch.CompanyIdUser.BranchId并只使用实体关联。

+0

谢谢,我有财产,以避免加载导航上下文。我可以简单地用公司ID查询分支,而不用在查询中加载或包括公司。 – Michael 2012-01-14 06:22:50