我有一个简单的 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 + " ..."
但我收到这个错误:
仅 LINQ to Entities 中的排序输入支持“Skip”方法。必须在方法“Skip”之前调用方法“OrderBy”。
您可以按照消息提示先尝试订购。
我不确定你的是什么Attendees
类看起来像,但假设它有一个 ID 字段:
x.Attendees.OrderBy(a => a.ID)
.Skip(1)
.Select(a => a.Person.CorrespondenceName).FirstOrDefault() + " ..."
其他一些注意事项:
我交换了你的Select
and FirstOrDefault
声明。按照你目前的方式,如果FirstOrDefault()
返回 null,然后Person.CorrespondenceName
会抛出异常。
但现在如果没有找到记录,你最终会得到"..."
。您可能需要调整您的第一个Where
子句过滤掉没有对应名称的记录,然后更改FirstOrDefault()
to First()
.
EDIT:
这应该引导你走向正确的方向(I hope)。假设它实际上可以转换为有效的 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";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)