C# 表达式生成器+;反射
我有一个相当广泛的观点,需要为某种“搜索引擎”提取信息。 我通过实体框架(使用存储库)访问此视图。我使用的类名searchprops包含两个字符串、一个propertyName和一个属性值 请允许我演示我正在努力解决的问题。在我看来,下面的解决方案应该是有效的,使用“propertyName”值并使用反射来用正确的值填充正确的属性,比如发送“vin”,“123”,应该在其中构建X.vin==123。。。 当然,这会触发一个错误,声明sql到实体不能与反射一起使用,这让我很困惑。。。。谁能给我指一下正确的方向吗? (但是,显式设置属性确实有效。因此,并非所有代码都是错误的,这只是反射。)C# 表达式生成器+;反射,c#,sql,linq,reflection,expression,C#,Sql,Linq,Reflection,Expression,我有一个相当广泛的观点,需要为某种“搜索引擎”提取信息。 我通过实体框架(使用存储库)访问此视图。我使用的类名searchprops包含两个字符串、一个propertyName和一个属性值 请允许我演示我正在努力解决的问题。在我看来,下面的解决方案应该是有效的,使用“propertyName”值并使用反射来用正确的值填充正确的属性,比如发送“vin”,“123”,应该在其中构建X.vin==123。。。 当然,这会触发一个错误,声明sql到实体不能与反射一起使用,这让我很困惑。。。。谁能给我指一
公共列表GetDataFromView(IDictionary actualValuesDictionary)
{
var searchprops=actualValuesDictionary.Select(keypair=>newsearchprop{PropertyName=keypair.Key,PropertyValue=keypair.Value}).ToList();
var predicate=PredicateBuilder.New();
foreach(searchprops中的var prop)
{
predicate=predicate.Or(p=>p.GetType().GetProperty(prop.PropertyName).Name.Contains(prop.PropertyValue));
}
var query=context.vw_AdHocReporting.AsExpandable().Where(谓词).ToList();
返回查询;
}
想想您的谓词
变量包含什么。或
谓词生成器只是将两个lambda(p1=>test1(p1)
和p2=>test2(p2)
组合为p=>test1(p)| | test2(p)
),并且不更改lambda,因此lambda正在调用GetType()
和GetProperty()
。如果您尝试Where(r=>r.GetType().GetProperty(“pname”).Name.Contains(…)
您将得到相同的错误-您无法将GetType().GetProperty
发送到SQL Server并期望任何操作正常。您需要一个表示r=>r.pname.Contains(val)
的表达式
树,并将其放入或
中。请参见LINQPadDump
.BTW,GetType().GetProperty(prop.PropertyName).Name
说prop.PropertyName
似乎有很长的路要走,我认为这不是您想要的。
public List<vw_AdHocReporting> GetDataFromView(IDictionary<string, string> actualValuesDictionary)
{
var searchprops = actualValuesDictionary.Select(keypair => new SearchProp {PropertyName = keypair.Key, PropertyValue = keypair.Value}).ToList();
var predicate = PredicateBuilder.New<vw_AdHocReporting>();
foreach (var prop in searchprops)
{
predicate = predicate.Or(p => p.GetType().GetProperty(prop.PropertyName).Name.Contains(prop.PropertyValue));
}
var query = context.vw_AdHocReporting.AsExpandable().Where(predicate).ToList();
return query;
}