简体   繁体   English

实体框架-使用SelectMany将LINQ方法链转换为查询语法

[英]Entity Framework - convert LINQ method chain with SelectMany to query syntax

I'd like to ask a following question. 我想问一个以下问题。 I'm building a query which will return some details about stored email packages. 我正在建立一个查询,该查询将返回有关存储的电子邮件包的一些详细信息。

Relationships: Packages 1-------N Addresses 1------N OutboundPackages 关系:包裹1 ------- N地址1 ------ N OutboundPackages

I would like to convert testOK query to expression syntax, specifically the following statement: 我想将testOK查询转换为表达式语法,特别是以下语句:

referenceGuids = pkg.PackageAddresses.SelectMany(s=>s.AddressOutboundPackages).Select(s=>s.Reference) 

Complete example: 完整的例子:

var test = (from stamp in IssuedStamps
            join pkg in Packages.Include(i=>i.PackageAddresses) on stamp.Id equals pkg.IssuedStampId
            join addr in Addresses on pkg.Id equals addr.Package_Id
            join outb in OutboundPackages on addr.Id equals outb.Address_Id
            where stamp.PortalUserId == "f31c2582-f663-4f2e-a9f7-d41ba138f86c" && stamp.Used

 //I'd like to convert the following SelectMany LINQ method chain expression to query syntax
 //let referenceGuids = pkg.PackageAddresses.SelectMany(s=>s.AddressOutboundPackages).Select(s=>s.Reference)                            
            select new 
            {
                StampId = stamp.Id,
                RecipientEmail = pkg.PackageAddresses.FirstOrDefault(x => x.AddressType == 1).EmailAddress,
                SenderEmail = pkg.PackageAddresses.FirstOrDefault(x => x.AddressType == 0).EmailAddress,                                   
                DateSent = pkg.ReceivedDate,
                Remarks = stamp.Description,
                Ref = referenceGuids,
                Subject = pkg.Subject,
                IsMassMailing = pkg.ProcessingPackageId == null || pkg.ProcessingPackageId == string.Empty
             } 
             ).ToList();


var testOK = (from stamp in IssuedStamps
              join pkg in Packages.Include(i=>i.PackageAddresses.Select(s=>s.AddressOutboundPackages)).Include(i=>i.PackageAddresses) on stamp.Id equals pkg.IssuedStampId

              where stamp.PortalUserId == "f31c2582-f663-4f2e-a9f7-d41ba138f86c" && stamp.Used       

              let referenceGuids = pkg.PackageAddresses.SelectMany(s=>s.AddressOutboundPackages).Select(s=>s.Reference)        

              select new 
              {                                    
                  StampId = stamp.Id,
                  RecipientEmail = pkg.PackageAddresses.FirstOrDefault(x => x.AddressType == 1).EmailAddress,
                  SenderEmail = pkg.PackageAddresses.FirstOrDefault(x => x.AddressType == 0).EmailAddress,

                   DateSent = pkg.ReceivedDate,
                   Remarks = stamp.Description,
                   Ref = pkg.PackageAddresses.SelectMany(s => s.AddressOutboundPackages).Select(s => s.Reference),
                   Subject = pkg.Subject,
                   IsMassMailing = pkg.ProcessingPackageId == null || pkg.ProcessingPackageId == string.Empty

               } 
               ).ToList();

That's easy. 这很容易。

referenceGuids = pkg.PackageAddresses
                 .SelectMany(s => s.AddressOutboundPackages)
                 .Select(s => s.Reference)

goes to

referenceGuids = (from pa in pkg.PackageAddresses
                  from aop in pa.AddressOutboundPackages
                  select aop.Reference)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM