如何获得SecondOrDefault?

Mas*_*ter 6 c# linq linq-to-entities

我有一个简单的linq lambda语句

Interactions = new BindableCollection<InteractionDTO>(ctx.Interactions.Where(x => x.ActivityDate > DateTime.Today)
   .Select(x => new InteractionDTO
   {
       Id = x.Id,
       ActivityDate = x.ActivityDate,
       subject = x.Subject,
       ClientNames = x.Attendees.Count == 1 ? x.Attendees.FirstOrDefault().Person.CorrespondenceName :
       x.Attendees.FirstOrDefault().Person.CorrespondenceName : "Multiple attendees"
    }));
Run Code Online (Sandbox Code Playgroud)

这将给我第一个客户名称,我试图让它出现前2名与会者后跟点.我试过这个

ClientNames = x.Attendees.Count == 1 ? 
             x.Attendees.FirstOrDefault().Person.CorrespondenceName :
             x.Attendees.FirstOrDefault().Person.CorrespondenceName +
             x.Attendees.Skip(1).FirstOrDefault().Person.CorrespondenceName + " ..."
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

只有LINQ to Entities中的排序输入才支持'Skip'方法.必须在方法'Skip'之前调用'OrderBy'方法.

Gra*_*ICA 8

您可以尝试先订购,如消息所示.

我不确定你的Attendees课程是什么样的,但假设它有一个ID字段:

x.Attendees.OrderBy(a => a.ID)
           .Skip(1)
           .Select(a => a.Person.CorrespondenceName).FirstOrDefault() + " ..."
Run Code Online (Sandbox Code Playgroud)

其他几点说明:

我换你SelectFirstOrDefault报表.你当前得到它的方式,如果FirstOrDefault()返回null,Person.CorrespondenceName则会抛出异常.

但现在如果没有找到记录,你最终会得到"...".您可能希望调整第一个Where子句以过滤掉没有对应名称的记录,然后更改FirstOrDefault()First().


编辑:

那应该引导你朝着正确的方向前进(我希望).这可能是您正在寻找的更多内容,假设它实际上可以转换为有效的SQL语句:

ClientNames = x.Attendees.Any()
                  ? x.Attendees.Count == 1
                      ? x.Attendees.Select(a => a.Person.CorrespondenceName).FirstOrDefault()
                      : x.Attendees.Count == 2
                          ? string.Join(", ", x.Attendees.OrderBy(a => a.ID).Take(2)
                                                         .Select(a => a.Person.CorrespondenceName).FirstOrDefault()
                          : string.Join(", ", x.Attendees.OrderBy(a => a.ID).Take(2)
                                                         .Select(a => a.Person.CorrespondenceName).FirstOrDefault() + " ..."
                  : "No client name available";
Run Code Online (Sandbox Code Playgroud)

  • 你需要一个Skip(1)来获得第二个或默认的. (2认同)