Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何仅获取选定属性的名称?_C#_Linq_Entity Framework_Reflection - Fatal编程技术网

C# 如何仅获取选定属性的名称?

C# 如何仅获取选定属性的名称?,c#,linq,entity-framework,reflection,C#,Linq,Entity Framework,Reflection,场景如下: -EF存储过程返回5列作为DataResult -我只需要3列,所以我编码了 var data = (from i in db.GetDataResult() select new DataResult { prop1 = i.prop1, prop2 = i.prop2, prop3 = i.prop3,

场景如下: -EF存储过程返回5列作为DataResult -我只需要3列,所以我编码了

var data = (from i in db.GetDataResult()
               select new DataResult
                 {
                   prop1 = i.prop1,
                   prop2 = i.prop2,
                   prop3 = i.prop3,
                     }).ToList();
  • 如果没有硬编码字符串名称,我希望获得所选列的名称,即prop1、prop2和prop3

如何通过编程实现这一点?

如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);
}

我想我明白了。你是说你不需要过滤器,你已经这样做了;您希望获得映射的列名。先看

也就是说,根据@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*
令人困惑的是,您在知道名称之前就以某种方式指定了列,但在代码示例中使用的是列名。指定的列应与列名匹配<代码中的code>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


另请参见。

typeof(DataType).GetProperties()。其中(p=>p.Name.Contains(“某物”)。选择(p=>p.Name)
将返回包含“某物”的所有属性的名称。您可以使用
Where()
子句对任何内容进行筛选。您可以使用一个只包含您要查找的字段的匿名对象,而不是
选择新数据结果
。请参阅示例。如果选择anonymous,则会出现无法将anonymoustype转换为IList或IEnumerable的错误。但是使用匿名而不是指定类型有什么好处呢?它也在处理匿名类型,
var s=x.GetType().GetProperties().Where(p=>p.Name.Contains(“something”).Select(p=>p.Name.FirstOrDefault()但这仍然需要将属性名作为字符串提前手写,就像您在新字符串[]{“Date”、“Day”、“DayOfWeek”}中所做的那样;然而,我要寻找的是从var数据中获取prop1、prop2和prop3的名称,如主要示例中所述,以避免弄乱字符串。您打算如何确定您想要的属性?这就是我试图实现的目标。第一步是仅从DB存储过程中选择或筛选我需要的列/属性,就像我在主文章的第二个代码示例中所做的那样…第二步,我希望使用反射或任何其他技术来获取我在第一步中选择/过滤的属性/列的名称。上面的硬编码字符串就是一个例子。使用任何来源(数据库或任何东西)作为输入;如何在不知道名称的情况下先筛选(使用列名),然后再获取列名?您没有根据列名筛选所需的列吗?谢谢您的坚持。数据[0].GetType().GetProperties()基于null或not null这正是我所需要的-我在John的回答中没有看到这一部分。你是对的,我事先就知道我想要哪些栏目是基于“未指定”的标准的——我想这很明显——我的错误。关于这个例子,我假设您知道prop1、2和3不是硬编码字符串,或者换句话说,您可以使用intellisense获取它们。谢谢你的帮助链接。
foreach (var prop in data[0].GetType().GetProperties())
{
    if (prop.GetValue(data[0], null) != null)
        Console.WriteLine("{0}, Type {1}", prop.Name, prop.PropertyType);
}