2012-01-13 5 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番目のクエリでこのコンパイルエラーを持っている:

エラー2は、暗黙的にタイプ 「System.Collections.Genericを変換できません。 IEnumerable> ' を' System.Linq.IQueryable 'に変更します。明示的な変換は、( あなたはキャストが欠けている?)私は事前に

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) 

おかげのようなプレーンなSQL文に似たユーザーのリストを、取得したい

存在します。

+0

それはあなたのSQLクエリを簡素化することができることを言及する価値があります:。 'dbo.UsersをSELECT *ブランチからの INNERがdbo.Branches.BranchId = dbo.Users.BranchId WHERE dbo.Branches.CompanyId = 8 ON dbo.Usersを登録しよう「あなたは「会社」に加入する必要は全くありません。 –

答えて

3

あなたのユーザークエリは次のようになります。

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

これは会社の任意の支店内のすべてのユーザーを返します。あなただけ使用できるようにそれは私には見えます

+1

この場合、依然として対象会社を取得するためのクエリが必要になります。 ブランチオブジェクトが既にcompanyIDにアクセスできるため、実際に会社を関与させる必要はありません。 Branchからクエリを開始し、結果のSQLクエリで結合を回避します。 – Patrick

0

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

を私はしかし、あなたがあなたのBranchエンティティにCompanyCompanyIdの両方を持って注意してください。たとえこのクエリをわずかに簡素化しても、これは冗長なようです。あなたはBranch.CompanyIdUser.BranchIdを取り除くことができ、エンティティの関連付けを使用するだけです。

+0

ありがとう、私はナビゲーションコンテキストを読み込むことを避けるためのプロパティがあります。私は照会の中に会社をロードしたり含めることなく、会社IDで支店を簡潔に照会することができます。 – Michael

関連する問題