使用LINQ比较和检查集合

3

我需要比较两个集合,并检查是否存在于 TransactionCommentsCollection 中的 TransactionLevelCommentsCollection 中的 transactionId。如果存在,则抛出一个 TransactionLinq.Key 的警报。

//代码

      For Each Record In (From TransactionCommentLinq In Me.TransactionCommentsCollection
                                    Join TransactionLinq In Me.TransactionsCollection On TransactionLinq.TransactionId Equals TransactionCommentLinq.TransactionId
                                    Join TaskLinq In Me.WorkflowsController.TasksController.TasksCollection On TaskLinq.TaskId Equals TransactionCommentLinq.TaskId
                                    Select TransactionLinq.Key,TransactionLinq.TransactionId, TaskLinq.TaskId Distinct)

// Have to check the values exists in TransactionLevelCommentsCollection here 
    Next

记录返回交易ID,我必须在TransactionLevelCommentsCollection中进行检查。

1
看起来像VB,但你把问题标记为C#... - Guillaume
2个回答

1
Dim rec = From TransactionCommentLinq In Me.TransactionCommentsCollection
          Join TransactionLinq In Me.TransactionsCollection On TransactionLinq.TransactionId Equals TransactionCommentLinq.TransactionId
          Join TaskLinq In Me.WorkflowsController.TasksController.TasksCollection On TaskLinq.TaskId Equals TransactionCommentLinq.TaskId
          Select TransactionLinq.Key,TransactionLinq.TransactionId, TaskLinq.TaskId Distinct

由于您只想比较TransactionId的值:

Dim transIds = rec.Select(Function(r) r.TransactionId)

现在您从上面的长Linq中获得了TransactionId列表。假设该值类型与您的TransactionLevelCommentsCollection的TransactionId相同。
使用Intersect:
Dim idExist = transIds.Intersect(TransactionLevelCommentsCollection.Select(Function(x) x.TransactionId)

现在,idExist将包含同时存在于两个集合中的ID列表。

根据新要求更新

由于OP需要Key而不是TransactionID,有三种方法可以获得Key

方法1: 继续使用上面展示的方法,使用以下代码获取项目的Key值:

For Each id In idExist 
    rec.First(Function(o) o.TransactionId = id).Key
Next

方法2: 以下代码是完全重写的(与上面显示的方法无关),它将从LINQ中返回具有TransactionLevelCommentsCollection中存在的TransactionIDrec对象:

Dim xrec = rec.Where(Function(o) TransactionLevelCommentsCollection.Exists(Function(tlc) tlc.TransactionId = o.TransactionId))

实际上,此代码将循环每个TransactionLevelCommentsCollection项,检查与每个rec项中的TransactionId匹配的TransactionId。不同之处在于它只用了1行代码。

方法3: 这也是完全重写的代码,使用联接查询:

Dim xrec = From r In rec
           From tlc In TransactionLevelCommentsCollection
           Where r.TransactionId = tlc.TransactionId
           Select r.TransactionId, r.Key

现在,xrec包含来自rec的项目列表,每个项目都有相应的TransactionID和Key属性,其中TransactionID存在于TransactionLevelCommentsCollection中。

2
在'intersect'函数的末尾添加一个闭括号')'。 - A Coder
我能否在交易ID的同时获取密钥? - user1512559

0

就像这样做

var GetCollection=(From TransactionCommentLinq In Me.TransactionCommentsCollection
                                Join TransactionLinq In Me.TransactionsCollection On TransactionLinq.TransactionId Equals TransactionCommentLinq.TransactionId
                                Join TaskLinq In Me.WorkflowsController.TasksController.TasksCollection On TaskLinq.TaskId Equals TransactionCommentLinq.TaskId
                                Select TransactionLinq.Key,TransactionLinq.TransactionId, TaskLinq.TaskId Distinct).Tolist();

Get another collection of TransactionCommentsCollection like var SearchList=Db.tblTransactionCommentsCollection.tolist()
Foreach(var Obj in GetCollection)
{
      for(int i=0;i<  SearchList.count();i++)
       {
              if(Obj.transactionId==SearchList.elementat(i).transactionId)
                  {
                        messageBox()/Alert(SearchList.elementat(i).transactionId);
                        break;
                   }
       }
}

我不知道它是否能按照您的要求为您服务,但是我已经得到了两个列表。一个是您的结果集,另一个是您要搜索特定项的列表。这个语法是C#的,您也可以在VB中实现,并且如果它对您有用,请标记答案为有用。


希望有一个更简单的方法。 - A Coder
1
请参考以下网址:https://dev59.com/bmXWa4cB1Zd3GeqPQMMj - A Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接