场景如下: - EF存储过程返回5列作为DataResult - 我只需要3列,所以我编码了
var data = (from i in db.GetDataResult()
select new DataResult
{
prop1 = i.prop1,
prop2 = i.prop2,
prop3 = i.prop3,
}).ToList();
如何以编程方式实现此目标?
答案 0 :(得分:1)
如Steve所述,Where()可用于过滤:
List<string> names = GetDesiredListOfNamesSomehow();
var props = typeof( DateTime ).GetProperties()
.Where( i => names.Contains( i.Name ) ).Select( i => i.Name );
foreach (var prop in props)
{
Console.WriteLine("Prop Name: " + prop);
}
但是,如果您知道要过滤的名称,则无需请求名称。所以我假设你试图自己获得实际的属性:
var props = typeof( DateTime ).GetProperties().Where( i => names.Contains( i.Name ) );
foreach (var prop in props)
{
Console.WriteLine("{0}, Type {1}", prop.Name, prop.PropertyType);
}
答案 1 :(得分:1)
我想我明白了。你说你不需要过滤器,你已经做过了;您想要获取映射的列名称。首先看this answer。
那就是基于@John Arlen的回答:
foreach (var prop in data[0].GetType().GetProperties())
{
Console.WriteLine("{0}, Type {1}", prop.Name, prop.PropertyType);
}
这里的问题是这通常应该给你:
prop1, *some type*
prop2, *some type*
prop3, *some type*
令人困惑的是,在知道名称之前,您以某种方式指定了列,但在代码示例中, 使用列名称。您指定的列应与列名称匹配;代码中的prop1
应与数据源中的列prop1
相对应。您暗示要根据列名过滤要获取的列(以及不获取的列)。
因此,假设您已根据其他一些(未指定的)标准事先知道您想要哪些列;也就是说,如果您知道自己获得了prop1
,prop2
和prop3
,却没有propX
或propY
。显然,如果您不知道名称,则无法在过滤列/属性之前获取列/属性名称。
修改强>
我觉得你可能想要确定哪些字段被填充,哪些不是。如果您知道没有任何字段为空,则此可能有效:
foreach (var prop in data[0].GetType().GetProperties())
{
if (prop.GetValue(data[0], null) != null)
Console.WriteLine("{0}, Type {1}", prop.Name, prop.PropertyType);
}
修改2