如何获得SecondOrDefault

本文关键字:SecondOrDefault 何获得 | 更新日期: 2023-09-27 18:02:34

我有一个简单的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"
    }));

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

ClientNames = x.Attendees.Count == 1 ? 
             x.Attendees.FirstOrDefault().Person.CorrespondenceName :
             x.Attendees.FirstOrDefault().Person.CorrespondenceName +
             x.Attendees.Skip(1).FirstOrDefault().Person.CorrespondenceName + " ..."

但是我得到这个错误:

方法'Skip'仅支持LINQ to Entities中的排序输入。方法' order '必须在方法'Skip'之前调用。

如何获得SecondOrDefault

您可以先尝试订购,正如消息所建议的。

我不确定你的Attendees类看起来像什么,但假设它有一个ID字段:

x.Attendees.OrderBy(a => a.ID)
           .Skip(1)
           .Select(a => a.Person.CorrespondenceName).FirstOrDefault() + " ..."

还有几个注释:

我交换了你的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";
// put this in your namespace...
public static class EnumerableExtension
{ 
    public static TSource SecondOrDefault<TSource>(this IEnumerable<TSource> source)
    {
        var iterator = source.GetEnumerator();
        if (iterator.MoveNext() && iterator.MoveNext() )            
            return iterator.Current;            
        else 
            return default( TSource );
    }
}
// Usage... var thing = list.SecondOrDefault();