如何迭代ICollection并附加其他字段

时间:2017-03-08 01:01:09

标签: c# asp.net entity-framework linq collections

我有一个网格/集合对象(让我们称之为SELECT_RESULTS),它是IList,ICollection,IEnumberable的子节点。

使用PL / SQL SELECT存储过程的返回结果填充SELECT_RESULTS。

我有两个问题: 1)我无法访问foreach循环中的SELECT_RESULTS字段,并且 2)我需要根据SELECT_RESULTS集合的主键值将从LINQ SELECT派生的另一个字段值添加到此集合中。

这是我到目前为止所尝试的:

// get the list of potential CUST_NAME that will be appended 
var q = (from tableX in dbContext.CUSTOMER
         where tableX.CUST_ID = 42
         select new
           {
              tableX.CUST_ID
              tableX.CUST_NAME
      tableX.A_DATE
       } );

// trying to get results to know what type it's a collection of:
var results = SELECT_RESULTS as CollectionOfPeople;

// dilemma : item is an Object here, so I'm unable to access the   
//   different field names in the collection :-(

foreach (var item in results)
{
    // question1) how to find the matching row in the collection. 
    // I am unable to see item.ID.  
    // Only can see item.ToString, item.ToHashCode, and other Object stuff

   var q1 = q.Where (x => x.CUST_ID == item.ID);

// question 2) I need to Append the CUST_NAME into the collection
// onto the row having matching CUST_ID == ID
   ???
}

1 个答案:

答案 0 :(得分:1)

不幸的是我不知道CollectionOfPeople是什么。所以可能还有其他选项,比如使用接口和DTO。

要回答您的第一个问题,您需要将投射到已知类型。如果您知道该类型,那么您可以尝试将其转换为该类型。

// If you know the type you could try something like this:
foreach (People item in results)
{
   var q1 = q.Where (x => x.CUST_ID == item.ID);
}

否则你可以看一下动态对象的可能性。

foreach (var item in results)
{
   // This compiles but it doesn't mean it is correct.
   // A non-existing property will throw an exception.
   int i = ((dynamic)item).ID;
   var q1 = q.Where (x => x.CUST_ID == i);
}

关于问题2,为什么不使用DTO来存储您的信息?如果您有班级人员,那么您可以在那里添加CUST_NAME。使事情变得更容易。匿名类型可能很有用,但在这种情况下,您似乎对自己并不容易。

如果需要展开对象,可以考虑使用expando对象。看看这里:Creating a dynamic, extensible C# Expando Object