我有两个清单:relatedContact
和fileContactIds
。我正在使用该查询循环循环relatedContacts列表,并仅当它也在列表中时,返回userClientCode的值(我将使其成为图像名称)fileContactIds
。如果该值不在第二个列表中,该如何输入一个值(例如:“默认”)?
var result = relatedContact.SelectMany(rc => rc.contacts.Select(pc => new RelatedContactsDescription
{
imageUrl = mappedRelatedContactsPath + pc.userclientcode + ".jpg",
userclientcode = pc.userclientcode,
description = rc.clienttaxonomy,
fullname = pc.fullname,
email = pc.contactdetails != null && pc.contactdetails.Count >= 1 ? pc.contactdetails[0].contactdata : "",
address = pc.contactdetails != null && pc.contactdetails.Count >= 2 ? pc.contactdetails[1].contactdata : "",
phoneNumber = pc.contactdetails != null && pc.contactdetails.Count >= 3 ? pc.contactdetails[2].contactdata : "",
populated = string.IsNullOrEmpty(pc.userclientcode) ||
string.IsNullOrEmpty(pc.fullname) ||
string.IsNullOrEmpty(pc.contactdetails[0].contactdata) ? false : true,
}))
.Where(el => fileContactIds.Contains(el.userclientcode)).ToList();
我读过:Lambdas和Linq以及Joins First或Default等,但是我所能看到的是如何从两者中获取匹配的数据,而不是如何在不匹配的情况下放置“后备”或默认值。
提前致谢
在您当前的代码中进行以下更改:
取出Where
条款,因为这不是服务宗旨,你需要Default
在那里UserClientCode
不存在,你不想使用它们过滤掉Where
更改SelectMany
通话中的以下内容:
userclientcode = pc.userclientcode
至
userclientcode = fileContactIds.Contains(pc.userclientcode) ?
pc.userclientcode : "Default"
您可以考虑使用使用Left Join
创建一个扁平化列表的帖子SelectMany
,但这将是一种实现方法的回合方式,这是在创建扁平化列表时简单实现的方法。
使用左联接
以下是“左联接”的代码选项,它GroupJoin
在C#中需要:
var result = relatedContact.SelectMany(rc => rc.contacts.Select(pc => {pc})
.GroupJoin(fileContactIds, pc => pc.userclientcode,
fc => fc.ContactId,new {pc,fc})
.SelectMany(
x => x.fc.DefaultIfEmpty()
(x,y) => new RelatedContactsDescription
{
userclientcode = (y == null) ? "Default":x.pc.userclientcode,
.........(fill remaining as per original logic)
});
它是如何工作的
relatedContact
使用创建匿名列表SelectMany
GroupJoin
与fileContactIds。我假设字段是ContactId
LeftJoin
SelectMany
明确声明中,将fileContactIds空值设置为null,然后在数据选择期间将其设置为空值,因此,我之前建议的null值应填写“ Default”,否则为特定值本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句