首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Lambda连接5个表

使用Lambda连接5个表
EN

Stack Overflow用户
提问于 2020-09-25 15:58:23
回答 2查看 92关注 0票数 1

我试着用lambda连接5张桌子。我想知道的是,我是否做得对,是否有更好的方法。任何建议都是非常感谢的。

代码语言:javascript
复制
 var myList = _context.Event
            .Join(_context.EventHost,
                e => e.EventHostId,
                eh => eh.Id,
                (e, eh) => new { Event = e, EventHost = eh })
            .Join(_context.EventAddress,
                eh => eh.EventHost.EventAddressID,
                ea => ea.ID,
                (eh, ea) => new { EventAddress = ea, EventHost = eh })
            .Join(_context.OrderHeaderGroup,
                ea => ea.EventHost.Event.Id,
                ohg => ohg.EventId,
                (ea, ohg) => new { EventAddress = ea, OrderHeaderGroup = ohg })
            .Join(_context.OrderHeader,
                ohg => ohg.OrderHeaderGroup.OrderHeaderGroupID,
                oh => oh.OrderHeaderGroupID,
                (oh, ohg) => new { OrderHeader = oh, OrderHeaderGroup = ohg })
            .Select(c => new {
                c.OrderHeader.OrderHeaderGroup.EventId,
                c.OrderHeader.EventAddress.EventAddress.Name,
                c.OrderHeader.EventAddress.EventAddress.Phone,
                c.OrderHeader.EventAddress.EventAddress.Address1,
                c.OrderHeader.EventAddress.EventAddress.Address2,
                c.OrderHeader.EventAddress.EventAddress.City,
                c.OrderHeader.EventAddress.EventAddress.Country,
                c.OrderHeader.EventAddress.EventAddress.PostalCode,
                c.OrderHeader.EventAddress.EventAddress.Email,
                c.OrderHeader.EventAddress.EventHost.Event.ConsultantId,
                c.OrderHeader.EventAddress.EventHost.Event.StartDate,
                c.OrderHeader.EventAddress.EventHost.Event.EndDate,
            }).Where(x => x.ContactId == contactId && x.StartDate >= newStartDate && x.EndDate <= newEndDate).ToList();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-25 16:03:34

是的,按照Microsoft:检查这里的建议,使用查询语法。

在编译时,根据C#规范中规定的规则将查询表达式转换为标准查询操作符方法调用。任何可以使用查询语法表示的查询也可以使用方法语法表示。但是,在大多数情况下,查询语法更易读、更简洁。

代码语言:javascript
复制
from event in _context.Event
join eventHost in _context.EventHost 
    on event.EventHostId equals eventHost.Id
join eventAddress in _context.EventAddress 
    on eventHost.EventAddressId equals eventAddress.Id
// etc
select new {/*You new anonymous type here*/}
票数 2
EN

Stack Overflow用户

发布于 2020-09-26 15:17:07

这里的问题不是优先代码可读性。所以,BTW,我认为Lambda比查询表单更易读。但那是因为我是个程序员。

问题是,您正试图从SQL开发人员的角度出发,并将其推入编程中。当LinqToEntities第一次出现时,我就这样做了,从SSMS等开始,我编写了一个查询,然后将Transliteration转换为C#。

解决办法是使用你的ORM。如果您使用一个功能丰富的ORM,您应该有一个叫做Navigation Properties的东西。它们已经为您提供了隐式联接,或者是在Fluent映射中显式声明的。因此,您不必每次编写LINQ语句时都重新描述每个联接。

如果您信任该语言并正确配置您的系统,您可能会得到如下结果:

代码语言:javascript
复制
// This is not shortened, this should be the whole thing.
var myList = _context.OrderHeader
.Where(x => x.EventAddress.Something.ContactId == contactId 
      && x.EventAddress.Something.StartDate >= newStartDate 
      && x.EventAddress.Something.EndDate <= newEndDate)
.Select(c => new DetailEntityView(c)).ToList();

我还建议使用“查看”类。这些实体不是配置为持久化到DB的实体,而是类似于C#中的DB视图。它们是使用较少的类,只传输数据。

代码语言:javascript
复制
public class DetailEntityView
{
    public int EventId { get; set; }
    public string Name { get; set; }
    // ... etc

    public DetailEntityView(OrderHeader c)
    {
        EventId = c.OrderHeaderGroup.EventId;
        Name = c.EventAddress.EventAddress.Name;
        // ... etc
    }
}

现在,有些ORMs没有世界上EF和NH的特色。所以在这种情况下,我很抱歉你或者你的团队选择了别的东西。

而且,您的所有联接都在it上,这是应该的。但是,一些自定义查询连接到不受约束的字段,如name字段或其他值。在这些情况下,您确实需要将这些特定的联接添加到查询中。但1.)真恶心。和2.)为什么?(第三条)然后你就可以做你在你的行动中所做的事。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64067553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档