2014-09-01 47 views
0

三個表將被接合在一起。多個左LINQ方法語法加入需要

Table [Package] 

ID (int) 
ContainerID (int) 
Code (string) 
Code2 (string) 


Table [UserHasPackages] 

UserID (Comes from Identity tables) (string) 
PackageID (int) 


Table [Container] 

ID (int) 
Name (string) 
Description (string) 

成表示一個對象,我想在我的視圖顯示視圖模型:

public class CustomViewModel 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } // Container.Name 
    public string Code { get; set; } // Package.Code 
    public string Code2 { get; set; } // Package.Code2 
} 

但我在做題的加入:

List<CustomViewModel> list = new List<CustomViewModel>(); 

     list = context.Packages.Join(
      context.Containers, 
      p => p.ContainerID, 
      c => c.ID, 
      (p, c) => new { p, c}) 
     .Join(        //error is here 
      context.UserHasPackages, 
      a => a.p.ID, 
      b => b.ApplicationUserId, 
      (a, b) => new { a, b }) 
     .Select(f => new CustomViewModel 
     { 
      ID = f.p.ID, 
      Name = f.c.Name, 
      Code = f.p.Code, 
      Code2 = f.p.Code2 
     }).ToList(); 

Type arguments for method cannot be inherited from the usage. Try specifying the type arguments explicitly. 

有另一種方式來做兩個連接(如上所述),這是更合適的方式?


SOLUTION

方法基於語法是一個不走這裏,不得不去查詢語法:

var query = (from package in context.Packages 
     join container in context.Containers on package.ContainerID equals container.ID 
     join userHasPackage in context.UserHasPackages on package.ID equals userHasPackage.PackageID 
     where userHasPackage.UserID == "SomeUser" 
     select new CustomViewModel 
     { 
      ID = package.ID, 
      Name = container.Name, 
      Code = package.Code, 
      Code2 = package.Code2 
     }).ToList(); 
+0

使用基於語法的查詢? – MarcinJuraszek 2014-09-01 01:40:26

回答

1

我假設你想要加入的UserHasPackages表因爲你想過濾特定用戶的結果(我只是把一個「SomeUser的」,因爲我不知道在哪裏了「UserHasPackages.ApplicationUserId」是從哪裏來的),因爲它不包括在視圖模型。

我相信像下面應該工作:

var list = context.Packages 
    .Join(context.Containers, p => p.ContainerID, c => c.ID, (p, c) => new { p, c }) 
    .Join(context.UserHasPackages, pc => pc.p.ID, u => u.PackageID, (pc, u) => new { pc.p, pc.c, u }) 
    .Where(pcu => pcu.u.UserID == "SomeUser") 
    .Select(pcu => new 
    { 
     pcu.p.ID, 
     pcu.c.Name, 
     pcu.p.Code, 
     pcu.p.Code2 
    }); 

你也可以做到這一點使用的查詢語法:

var query = from package in context.Packages 
      join container in context.Containers on package.ContainerID equals container.ID 
      join userHasPackage in context.UserHasPackages on package.ID equals userHasPackage.PackageID 
      where userHasPackage.UserID == "SomeUser" 
      select new 
      { 
       package.ID, 
       container.Name, 
       package.Code, 
       package.Code2 
      }; 
+0

請檢查我原來的職位的答案,我不得不調整你的答案了一點,但你讓我開始! (就像這樣人們知道檢查OP) – Zac 2014-09-01 03:31:55