检查隐式类型变量是否包含特定值

时间:2011-07-29 11:41:49

标签: linq var

我有一个隐式变量,它包含一个包含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。

2 个答案:

答案 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}))
{  ....