回答

收藏

多个左联接的LINQ方法语法

技术问答 技术问答 337 人阅读 | 0 人回复 | 2023-09-12

三个表需要连接在一起。  Y) D1 _& z  r9 S8 l! e7 y" n; p
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)进入一个视图模型,表示要显示在我的视图中:) U" `+ L3 \/ l) N9 k
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}但是我在加入时遇到了问题:
9 H/ n3 o: j0 o8 [List list = new List();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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.还有另外两种连接方式(如上所述)吗?
7 B8 n+ B; |0 t: r解决方案
. I0 B, [) U0 F; \7 F+ o, l5 t$ |这里基于方法的语法行不通,必须与查询语法一起使用:* P2 L4 z0 \# l: b/ u! o* G
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.Code        }.ToList();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  c; y7 ^2 |+ @% M0 H
    解决方案:                                                                / N: m$ w2 C; ?( e
                                                                假设你想加入我UserHasPackages表,因为你想过滤特定用户的结果(我只是输入了’SomeUser’,因为我不确定’UserHasPackages.ApplicationUserId’视图模型中不包含来源)。- @3 a3 S5 A& |
我信类似以下内容的方法应该起作用:2 a6 Z/ J" p8 Z; V8 u9 M8 J$ [* \
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.Code二    };也可以用查询语法来做到这一点:( O4 _( K; @8 B  E, J
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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则