2014-09-01 3 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) 

в ViewModel, который представляет собой объект, я хотел бы показать, на мой взгляд:

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. 

Есть другой способ сделать два объединения (как описано), это более правильный способ?


РЕШЕНИЕ синтаксис на основе

Метод является непроходной здесь, должен был пойти с синтаксисом запросов:

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

ответ

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

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