我试着用lambda连接5张桌子。我想知道的是,我是否做得对,是否有更好的方法。任何建议都是非常感谢的。
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();发布于 2020-09-25 16:03:34
是的,按照Microsoft:检查这里的建议,使用查询语法。
在编译时,根据C#规范中规定的规则将查询表达式转换为标准查询操作符方法调用。任何可以使用查询语法表示的查询也可以使用方法语法表示。但是,在大多数情况下,查询语法更易读、更简洁。
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*/}发布于 2020-09-26 15:17:07
这里的问题不是优先代码可读性。所以,BTW,我认为Lambda比查询表单更易读。但那是因为我是个程序员。
问题是,您正试图从SQL开发人员的角度出发,并将其推入编程中。当LinqToEntities第一次出现时,我就这样做了,从SSMS等开始,我编写了一个查询,然后将Transliteration转换为C#。
解决办法是使用你的ORM。如果您使用一个功能丰富的ORM,您应该有一个叫做Navigation Properties的东西。它们已经为您提供了隐式联接,或者是在Fluent映射中显式声明的。因此,您不必每次编写LINQ语句时都重新描述每个联接。
如果您信任该语言并正确配置您的系统,您可能会得到如下结果:
// 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视图。它们是使用较少的类,只传输数据。
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.)为什么?(第三条)然后你就可以做你在你的行动中所做的事。
https://stackoverflow.com/questions/64067553
复制相似问题