C# 将属性名作为字符串.NET传递到方法中
我正在为.NETMVC应用程序使用LINQtoSQL 在我的数据库中,有一组列中有“Y”或“N”值 我正在尝试编写一个通用方法,它将返回数据库中的所有记录,其中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
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:请阅读已经发布的评论/答案,了解为什么这不起作用。