C# 如何构建表达式以将Where子句一般应用于IQueryable<;T>;?

C# 如何构建表达式以将Where子句一般应用于IQueryable<;T>;?,c#,generics,expression-trees,C#,Generics,Expression Trees,我有一个名为TestObject的类,它有一个Name参数 我创建一个列表,并添加其中的2个。我想为任何IQueryable创建一个泛型Where()子句方法 我一直在玩弄表情,但我真的不知道自己在做什么 我用一些硬编码的值创建了这个方法进行测试,我想让它进行收集。其中(c=>c.Name==“Boris”): 公共静态IQueryable应用(IQueryable集合) { var parameterName=“Name”; var searchValue=“Boris”; var selec

我有一个名为
TestObject
的类,它有一个
Name
参数

我创建一个列表,并添加其中的2个。我想为任何
IQueryable
创建一个泛型
Where()
子句方法

我一直在玩弄表情,但我真的不知道自己在做什么

我用一些硬编码的值创建了这个方法进行测试,我想让它进行
收集。其中(c=>c.Name==“Boris”)

公共静态IQueryable应用(IQueryable集合)
{
var parameterName=“Name”;
var searchValue=“Boris”;
var selectorParameter=表达式.参数(类型(T),参数名称);
var searchTermExpression=Expression.Constant(searchValue);
var checkequalexpression=Expression.Call(selectorParameter,typeof(string).GetMethod(“等于”),searchTermExpression);
var methodCallExpression=Expression.Call(typeof(Queryable),
“哪里”,
新类型[]{collection.ElementType},
收藏,表达,
表达式.Lambda(checkequalexpression,?????);
返回collection.Provider.CreateQuery(methodCallExpression);
}

我不确定
?????
中的内容,甚至不确定这是否正确。有人能提供建议吗?

这里是一个如何做的例子,通过评论,它应该可以澄清你做错了什么

public static IQueryable<T> Apply<T>(IQueryable<T> collection) {
    var propertyName = "Name";
    var searchValue = "Boris";
    // we have parameter "c"
    var selectorParameter = Expression.Parameter(typeof(T), "c");
    // constant "Boris"
    var searchTermExpression = Expression.Constant(searchValue);
    // "c.Name"
    var selector = Expression.PropertyOrField(selectorParameter, propertyName);
    // "c.Name == "Boris"
    var equal = Expression.Equal(selector, searchTermExpression);
    // c => c.Name == "Boris"
    var where = Expression.Lambda<Func<T, bool>>(equal, selectorParameter);
    return collection.Where(where);
}
公共静态IQueryable应用(IQueryable集合){
var propertyName=“Name”;
var searchValue=“Boris”;
//我们有参数“c”
var selectorParameter=表达式参数(类型为(T),“c”);
//常数“Boris”
var searchTermExpression=Expression.Constant(searchValue);
//“c.姓名”
变量选择器=Expression.PropertyOrField(selectorParameter,propertyName);
//“c.Name==”Boris“
var equal=表达式.equal(选择器,searchTermExpression);
//c=>c.Name==“Boris”
var,其中=表达式λ(相等,选择器参数);
退货托收。何处(何处);
}

下面是一个如何做的示例,通过注释,它应该可以澄清您做错了什么

public static IQueryable<T> Apply<T>(IQueryable<T> collection) {
    var propertyName = "Name";
    var searchValue = "Boris";
    // we have parameter "c"
    var selectorParameter = Expression.Parameter(typeof(T), "c");
    // constant "Boris"
    var searchTermExpression = Expression.Constant(searchValue);
    // "c.Name"
    var selector = Expression.PropertyOrField(selectorParameter, propertyName);
    // "c.Name == "Boris"
    var equal = Expression.Equal(selector, searchTermExpression);
    // c => c.Name == "Boris"
    var where = Expression.Lambda<Func<T, bool>>(equal, selectorParameter);
    return collection.Where(where);
}
公共静态IQueryable应用(IQueryable集合){
var propertyName=“Name”;
var searchValue=“Boris”;
//我们有参数“c”
var selectorParameter=表达式参数(类型为(T),“c”);
//常数“Boris”
var searchTermExpression=Expression.Constant(searchValue);
//“c.姓名”
变量选择器=Expression.PropertyOrField(selectorParameter,propertyName);
//“c.Name==”Boris“
var equal=表达式.equal(选择器,searchTermExpression);
//c=>c.Name==“Boris”
var,其中=表达式λ(相等,选择器参数);
退货托收。何处(何处);
}

是否确定
表达式.参数(typeof(T),parameterName)
parameterName的类型为
T
。它是
T
的一个属性(我猜是字符串)。您可能需要
Expression.Property()
为此,我不知道,我从另一个网站复制并粘贴了它,该网站做了与我想要的类似的事情,我正在尝试让它工作,但我真的不知道我在做什么。您确定
Expression.Parameter(typeof(t),parameterName)
parameterName的类型为
T
。它是
T
的一个属性(我猜是字符串)。你可能需要
Expression.Property()
我不知道,我从另一个网站复制并粘贴了它,它做了一些类似于我想要的事情,我正在努力让它工作,但我真的不知道我在做什么。谢谢,这比我之前尝试的要简单得多!我真的很感激。@NibblyPig如果你有其他问题,不要忘了标记为答案,否则人们会一次又一次地问这个问题,并浪费时间认为它仍然没有答案。@Evk我知道,我想先测试一下:)它工作得很好,我能够扩展它来做大量其他很酷的事情。非常感谢,我真的很感激。谢谢,这比我想做的要简单得多!我真的很感激。@NibblyPig如果你有其他问题,不要忘了标记为答案,否则人们会一次又一次地问这个问题,并浪费时间认为它仍然没有答案。@Evk我知道,我想先测试一下:)它工作得很好,我能够扩展它来做大量其他很酷的事情。非常感谢,我真的很感激。