我有一个网格/集合对象(让我们称之为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
???
}
答案 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。