Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# 将属性名作为字符串.NET传递到方法中_C#_.net_Linq To Sql_Reflection - Fatal编程技术网

C# 将属性名作为字符串.NET传递到方法中

C# 将属性名作为字符串.NET传递到方法中,c#,.net,linq-to-sql,reflection,C#,.net,Linq To Sql,Reflection,我正在为.NETMVC应用程序使用LINQtoSQL 在我的数据库中,有一组列中有“Y”或“N”值 我正在尝试编写一个通用方法,它将返回数据库中的所有记录,其中columnName==“Y” 到目前为止我已经知道了 public IQueryable<Approved> ReturnRecordsByObjectiveFlag(string columnName) { return from approved in db.Approved

我正在为.NETMVC应用程序使用LINQtoSQL

在我的数据库中,有一组列中有“Y”或“N”值

我正在尝试编写一个通用方法,它将返回数据库中的所有记录,其中
columnName==“Y”

到目前为止我已经知道了

public IQueryable<Approved> ReturnRecordsByObjectiveFlag(string columnName)
{       
    return from approved in db.Approved
           where approved.GetType().GetProperties().Where(x => x.Name.Equals(columnName)).Equals("Y")
           select approved;
}
public IQueryable ReturnRecordsByObjectiveFlag(string columnName)
{       
从数据库中批准返回。已批准
where approved.GetType().GetProperties().where(x=>x.Name.Equals(columnName)).Equals(“Y”)
选择已批准的;
}
但这给了我这个错误

成员访问“System.Reflection.MemberInfo”的“System.String Name”对类型“System.Reflection.PropertyInfo[]无效

你知道我哪里会出错吗


谢谢。

问题在于不能在LINQ查询中使用反射

有多少列-是固定的相对较小的数字吗?如果是这样,请使用switch语句在多个LINQ查询之间进行选择。这更干净、更快

如果是大量的列,或者它们是动态的,您可以构造一个动态SQL语句,但是要小心检查可能的注入攻击

public IQueryable<Approved> ReturnRecordsByObjectiveFlag(string columnName)
{   
    var param = Expression.Parameter(typeof(Approved), "x");
    var predicate = Expression.Lambda<Func<Approved,bool>>(
        Expression.Equal(
            Expression.PropertyOrField(param, columnName),
            Expression.Constant("Y")
        ), param);
    return db.Approved.Where(predicate);
}
(现在可以处理所有
string
char
char?

  • GetType()
    返回
    Type

  • GetProperties()
    返回
    PropertyInfo[]

  • 其中(..)
    返回
    IEnumerable

你打电话来了

IEnumerable<PropertyInfo>.Equals(string)
IEnumerable.Equals(字符串)
这似乎是错的,不是吗

approved.GetType().GetProperties()
将返回PropertyInfo[]对象。即使使用
筛选它,其中
仍然不是属性的值,它基本上是满足临界值的属性集合,即使该集合只有一个成员

要按名称获取特定属性,最好使用Type类的
GetProperty()
方法,如下所示:

PropertyInfo pi = approved.GetType().GetProperty(columnName);
bool isApproved = pi.GetValue(approved, null).Equals("Y");
但是,您还没有完成。您仍然需要根据属性的值筛选对象,这是通过对属性使用
GetValue()
方法完成的,如下所示:

PropertyInfo pi = approved.GetType().GetProperty(columnName);
bool isApproved = pi.GetValue(approved, null).Equals("Y");
或者把一切都放在你的上下文中:

return from approved in db.Approved
where approved.GetType().GetProperty(columnName)
                     .GetValue(approved, null).Equals("Y")
select approved;

这是因为最后一个Equals方法在过滤后的IQueryable集合上运行,而不是在属性值本身上运行

请尝试以下方法:

return from approved in db.Approved
               where approved.GetType().GetProperties().Where(x => x.Name.Equals(columnName) && (string)x.GetValue(db.Approved, null) == "Y")
               select approved;

批准的
类型是什么?
?不是固定的,并且可能有大量的列名。这是Enterprisey。反射在Linq2SQL下不起作用。您必须构造一个表达式。动态LINQ怎么样?(和)@abatischev类型?Approved是类型。它是我数据库中的一个表。您可以创建LINQ查询,尽管谢谢Marc。我得到了错误System.InvalidOperationException:没有为类型System.Nullable`1[System.Char]定义二进制运算符Equal'和'System.String'。@Doozer1979:修复您的问题,或修复您的DB架构。@Doozer1979:尝试
Expression.Constant((char?'Y'))
@leppie仍然存在相同的错误。我很想修复数据库模式,但遗憾的是,这不是我的错误call@Doozer1979-属性是
字符串
还是
字符
?不是我,但你的答案不起作用,正如许多评论中已经指出的那样。我也没有否决。它给了我一个错误:方法“GetValue”没有重载接受“1”参数umentsSorry在粘贴时错过了第二个参数,现在应该可以工作了。不幸的是,这仍然不起作用。我同意Marc的解决方案,但我感谢您花费的时间和精力。-1:请阅读已经发布的评论/答案,了解为什么这不起作用。