Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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#_Sql_Linq_Reflection_Expression - Fatal编程技术网

C# 表达式生成器+;反射

C# 表达式生成器+;反射,c#,sql,linq,reflection,expression,C#,Sql,Linq,Reflection,Expression,我有一个相当广泛的观点,需要为某种“搜索引擎”提取信息。 我通过实体框架(使用存储库)访问此视图。我使用的类名searchprops包含两个字符串、一个propertyName和一个属性值 请允许我演示我正在努力解决的问题。在我看来,下面的解决方案应该是有效的,使用“propertyName”值并使用反射来用正确的值填充正确的属性,比如发送“vin”,“123”,应该在其中构建X.vin==123。。。 当然,这会触发一个错误,声明sql到实体不能与反射一起使用,这让我很困惑。。。。谁能给我指一

我有一个相当广泛的观点,需要为某种“搜索引擎”提取信息。 我通过实体框架(使用存储库)访问此视图。我使用的类名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)
表达式
树,并将其放入
中。请参见LINQPad
Dump
.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;
    }