我有一个隐式变量,它包含一个包含SQL查询(LINQ)结果的List。
此集代表先前选择的列表的现有客户端。
通过存储过程,我将使用一组新的客户端来填充下拉列表。迭代这组数据,如果已包含在现有条目列表中,则排除这些记录。
如何使用隐式类型变量进行检查?
var existingClients = (from doc in TBL_Documents
join c in TBL_CONTACT on doc.CONTACTID equals c.CONTACTID
where doc.DOCID.Equals(DocID)
select new { c.CONTACTID, c.FULLNAME }).ToList();
var resultSet = sp_ActiveContacts(index).ToList();
foreach (var record in resultSet)
{
//How could I achieve something like this if condition (like a List)?
if (!existingClients.Contains(record.CONTACTID))
{
optionTags += "<option value=" + record.CONTACTID + ">" + record.Name + "</option>";
}
}
如果可能的话,我会优先避免创建一个临时列表来存储用于if条件的CONTACTID。
答案 0 :(得分:2)
匿名类型通过检查每个属性来测试相等性,因此您可以这样做:
if (!existingClients.Contains(new { record.CONTACTID, record.FULLNAME }))
(假设您的record
变量具有FULLNAME
属性。否则只需使用适当的值构造匿名对象。)
有关详细信息,请参阅this answer。
修改强>
更容易的可能是:
if (!existingClients.Any(c => c.CONTACTID == result.CONTACTID))
答案 1 :(得分:0)
谢谢马特的好答案!在性能方面,您的建议与使用临时列表存储ID并检查此列表之间的区别是什么?
...
List<Guid> existIDs = new List<Guid>();
foreach (var c in existingContacts)
{
existIDs.Add(c.CONTACTID);
}
var resultSet = db.sp_PagingActiveContacts(idx, userLogin, range).ToList();
foreach (var record in resultSet)
{
if (!existIDs.Contains(new {record.CONTACTID}))
{ ....