【问题标题】:Linq select from two tables order by listLinq 从两个表中按列表顺序选择
【发布时间】:2012-11-17 09:00:03
【问题描述】:

我在 DB 中有两个要从中选择的表。在其中一个“事件”中,我有事件(Id,开始,结束,类型),在另一个中,我有“Events_before_after”,我收集与“事件”中的一些事件相关的事件 - (Id,EventId,开始、结束、输入)。
我还有一个事件 id 列表,我需要在选择查询中对事件进行排序。

这就是我所拥有的:

List<int> orderIds = ...

from order in orderIds
join event in events order on order equals event.id
select new DataEvent ()
{
    eventId = event.Id,
    start = event.start,
    end = event.end,
    type = event.type
}).Concat
from eventOther in Events_before_after
select new DataEvent ()
{
    eventId = eventOther.Id,
    start = eventOther.start,
    end = eventOther.end,
    type = eventOther.type
}

是否也可以订购第二个选择?我的意思是 - 有没有办法通过链接到“事件”的eventId 订购它?

我需要的是:

event1
event2
eventBefore3
event3
eventAfter3

我拥有的是:

event1
event2
event3
eventBefore3
eventAfter3

【问题讨论】:

    标签: c# sql linq select sql-order-by


    【解决方案1】:

    你可以这样做:

     //your query
     ...
    from eventOther in Events_before_after
    select new DataEvent ()
    {
        eventId = eventOther.Id,
        start = eventOther.start,
        end = eventOther.end,
        type = eventOther.type
    }
    into NewEvent
    order by NewEvent.eventId
    select NewEvent;
    

    【讨论】:

      【解决方案2】:

      如果我明白了您的要点,您希望将给定键上的相关事件组合在一起,对它们进行排序,然后按照给定的键顺序投影和展平它们....如果您想这样做,请尝试以下操作:

      var orderedEvents = orderIds.Join(
                           //Construct Groups 
                           events.GroupBy( e => e.Id)
                                 .GroupJoin( Events_before_after,
                                             g => g.Key,
                                             e => e.EventId,
                                             (gEvent, gEventBA) => new { Key = gEvent.Key,
                                             EventGroup = 
                                             gEvent.Select( e => new DataEvent ()
                                                           {
                                                            eventId = e.Id,
                                                            start = e.start,
                                                            end = e.end,
                                                            type = e.type
                                                           })
                                                    .Concat( gEventBA.Select( e => new DataEvent ()
                                                                      {
                                                                       eventId = e.Id,
                                                                       start = e.start,
                                                                       end = e.end,
                                                                       type = e.type
                                                                      }))
                                                    .OrderBy(e => e.eventId)),
                            //Project along keys
                            o => o,
                            anon => anon.Key,
                            (o,anon) => anon.EventGroup)
                            //Flatten groups
                                 .SelectMany( g => g);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        • 2020-09-25
        相关资源
        最近更新 更多