如何使用if else语句选择新的内部

时间:2019-07-16 23:01:58

标签: c# linq

我有一个 FlightTicketRequestDocument 列表,用于患者及其陪同人员申请飞机票。这些文件与名为 GroupId dataframe = pd.read_sql('Select * FROM classic.dbo.sample3',con=conn) dataframe.to_csv('data.csv', index = None) 分组。

我正在尝试将它们分组到该对象中

GUID

PrincipalDocument (如果有的话)保存患者。(如果没有,我们只想要第一个陪同)

GroupDocuments 拥有陪同人员。(第一个放置在 PrincipalDocument 中的人除外)


我正在尝试使用不同的表达式在public class FlightTicketRequestDocumentGroup { public Guid GroupId { get; set; } public FlightTicketRequestDocument PrincipalDocument { get; set; } public List<FlightTicketRequestDocument> GroupDocuments { get; set; } } 语句中设置我的值,这取决于是否有耐心,但是我遇到了错误:

  

不支持嵌套查询。 Operation1 ='Case'Operation2 ='VarRef'

这是代码(注意:当此人是患者时, StayEscortId 为空。):

Select New

我可以使用什么代替条件运算符var indexGroups = await _db.FlightTicketRequests .OrderBy(f => f.FirstName) .ProjectTo<FlightTicketRequestDocument>() .GroupBy(f => f.GroupId) .Select(g => new FlightTicketRequestDocumentGroup { GroupId = g.Key, PrincipalDocument = g.Any(f => f.StayEscortId == null) ? g.FirstOrDefault(f => f.StayEscortId == null) : g.FirstOrDefault(), GroupDocuments = g.Any(f => f.StayEscortId == null) ? g.Where(c => c.StayEscortId != null).ToList() : g.Where(c => c.StayEscortId != null).OrderBy(f => f.FullName).Skip(1).ToList() }) .ToListAsync(cancellationToken);

3 个答案:

答案 0 :(得分:0)

需要检查一次或两次(或一次或两次调整),但是如果我记得正确的话,表达式树接受空合并运算符,您可以尝试在三元位置进行交换。 从您的示例开始(和BASING),也许像下面这样?

var indexGroups = await _db.FlightTicketRequests
                .OrderBy(f => f.FirstName)
                .ProjectTo<FlightTicketRequestDocument>()
                .GroupBy(f => f.GroupId)
                .Select(g => new FlightTicketRequestDocumentGroup
                {
                    GroupId = g.Key,
                    PrincipalDocument = g.FirstOrDefault(f => f.StayEscortId == null) ?? g.OrderBy(f => f.FullName).FirstOrDefault(),
                    GroupDocuments = g.Where(c => c.StayEscortId != null).OrderBy(f => f.FullName).Skip(Math.Max(x.Count(y => y.StayEscortId == null), 1)).ToList()
                })
                .ToListAsync(cancellationToken);

答案 1 :(得分:0)

我最终使用的解决方案:

如@mjwills所指定,由于我只希望 StayEscordId 首先是null的值,所以我要做的就是将其排序为boolean({{ 1}}的值最终排在顶部)。

对于该小组的其他成员,我在跳过1(我选择的第一个)的同时执行相同的操作。

修改后的代码:

false

答案 2 :(得分:-1)

如果要使用if / else而不是三元条件,则查询的外观如下。您只需要在.Select()内使用一个代码块即可返回结果:

var flightTicketRequestDocuments = await _db.FlightTicketRequests
    .OrderBy(f => f.FirstName)
    .ProjectTo<FlightTicketRequestDocument>()
    .GroupBy(f => f.GroupId)
    .ToListAsync(cancellationToken);

var indexGroups = flightTicketRequestDocuments
    .Select(g =>
    {
        FlightTicketRequestDocument principalDocument;
        List<FlightTicketRequestDocument> groupDocuments;

        if (g.Any(f => f.StayEscortId == null))
        {
            principalDocument = g.FirstOrDefault(f => f.StayEscortId == null);
            groupDocuments = g.Where(c => c.StayEscortId != null).ToList();
        }
        else
        {
            principalDocument = g.FirstOrDefault();
            groupDocuments = g.Where(c => c.StayEscortId != null).OrderBy(f => f.FullName).Skip(1).ToList();
        }

        return new FlightTicketRequestDocumentGroup 
        { 
            GroupId = g.Key, 
            PrincipalDocument = principalDocument,
            GroupDocuments = groupDocuments 
        };
    }) 
    .ToList();

请注意,此方法需要在执行IQueryable之前枚举.Select() ,以便将其应用于IEnumerable