如何获得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'之前调用。
您可以先尝试订购,正如消息所建议的。
我不确定你的Attendees
类看起来像什么,但假设它有一个ID字段:
x.Attendees.OrderBy(a => a.ID)
.Skip(1)
.Select(a => a.Person.CorrespondenceName).FirstOrDefault() + " ..."
还有几个注释:
我交换了你的Select
和FirstOrDefault
语句。你目前得到它的方式,如果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();