多个左联接的LINQ方法语法 [英] LINQ method syntax for multiple left join
问题描述
需要将三个表连接在一起.
Three tables are needed to be joined together.
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)
进入一个表示我想在视图中显示的对象的视图模型:
Into a viewmodel that represents an object I'd like to display in my view:
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
}
但是我在加入时遇到了问题:
But I'm having problems doing the join:
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.
是否还有另一种方法(如上所述)进行两次联接?
Is there another way to do two joins (as described) that's the more-proper way?
解决方案
基于方法的语法在这里是行不通的,必须与查询语法一起使用:
Method based syntax is a no-go here, had to go with query syntax:
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();
推荐答案
我假设您想加入UserHasPackages表,因为您想过滤特定用户的结果(我之所以输入"SomeUser"是因为我不确定'UserHasPackages.ApplicationUserId'的来源),因为它没有包含在视图模型中.
I'm assuming that you want to join the UserHasPackages table because you wanted to filter the results for a specific user (I just put in a 'SomeUser' because I'm not sure where the 'UserHasPackages.ApplicationUserId' came from) since it is not included on the view model.
我相信类似以下内容的方法应该起作用:
I believe something like the following should work:
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
});
您也可以使用查询语法来做到这一点:
You could also do this using the query syntax:
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
};
这篇关于多个左联接的LINQ方法语法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!