2012-01-13 2 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 'Вам не нужно вообще вступать в« Компании ». –

ответ

3

Ваш запрос пользователя может быть:

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

Это вернет все пользователи в любом филиале компании.

+1

В этом случае вам понадобится запрос для получения целевой компании. Вам не обязательно привлекать компанию, поскольку объект Branch имеет доступ к идентификатору компании уже. Запустите запрос из Branch, и вы избежите объединения в результирующий SQL-запрос. – Patrick

0

Она смотрит на меня, как вы могли бы просто использовать:

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

Я заметил, у вас есть и Company и CompanyId на вашем Branch сущности, хотя. Это кажется излишним, хотя это немного упрощает этот запрос. Вы должны быть в состоянии избавиться от Branch.CompanyId и User.BranchId и просто использовать ассоциации сущностей.

+0

Спасибо, у меня есть свойство, чтобы избежать загрузки контекста навигации. я могу simiply querry филиала с идентификатором своей компании, без загрузки или включения компании в запрос. – Michael

Смежные вопросы