Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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# 创建不带谓词的IQueryable扩展方法_C#_Asp.net Mvc - Fatal编程技术网

C# 创建不带谓词的IQueryable扩展方法

C# 创建不带谓词的IQueryable扩展方法,c#,asp.net-mvc,C#,Asp.net Mvc,在搜索了很多地方后,我最终请求你的帮助 问题是:我需要使用IQueryable创建一个过滤器,但没有谓词。例如,假设我有以下课程: public class MyClass: IQueryable { public string P1 {get; set;} public string P2 {get; set;} } 现在,我需要为这个类或任何其他类提供一个过滤器,我可以这样调用它: var ex1 = MyClass.MyFilter<P1>; 在AS

在搜索了很多地方后,我最终请求你的帮助

问题是:我需要使用IQueryable创建一个过滤器,但没有谓词。例如,假设我有以下课程:

public class MyClass: IQueryable
{
     public string P1 {get; set;}
     public string P2 {get; set;}
}
现在,我需要为这个类或任何其他类提供一个过滤器,我可以这样调用它:

  var ex1 = MyClass.MyFilter<P1>;

在ASP.NET中将属性或类绑定到网格和列时,剑道网格正在使用类似的方法。非常感谢您的任何想法或建议!谢谢大家!

IQueryable只是一个数据类型,与其他类型一样,因此您可以创建一个扩展函数来接受和返回该类型的对象

  public static class QueryExtensions
  {
      public IQueryable<MyClass> MyFilter(this IQueryable<MyClass> query, string p1)
      {
          return query.Where(p => p.SomeProperty == p1);
      }
  }

我有点不确定你想做什么,但这是否符合以下原则:

    public class MyClass
    {
        public string P1 { get; set; }
    }

    public static class QueryableExtensions
    {
        public static IQueryable<T> MyFilter<T>(this IQueryable<T> queryable, string value) where T : MyClass
        {
            return queryable.Where(arg => arg.P1 == value);
        } 
    }
公共类MyClass
{
公共字符串P1{get;set;}
}
公共静态类QueryableExtensions
{
公共静态IQueryable MyFilter(此IQueryable可查询,字符串值),其中T:MyClass
{
返回queryable.Where(arg=>arg.P1==value);
} 
}

谢谢你的回答!还有一个问题:有没有办法避免谓词表达式,即使是在函数本身内部?我希望能够在来自EF或nHibernate的DB查询中使用这个过滤器。非常感谢。这很管用,日本佬!非常感谢。还有什么方法可以将SomeProperty也放入变量中呢?要[传入SomeProperty,请使用lambda表达式-您正试图摆脱的谓词(但没有理由真正摆脱它).Hello janhartmann!是的,是附近的东西!我也在尝试去除return语句中的lambda,我正在尝试使用泛型声明,这对每个类都有效。我建议您引入一个接口并使用它而不是MyClass。然后让您的其他类实现接口wh我包含属性。接口或抽象类,随你喜欢。谢谢janhartmann,现在正在研究它。我认为最终状态将是上述两个答案的组合,使用SomeProperty的反射。我建议在所需的类上共享一个抽象类或接口,并放弃反射。
  var ex1 = someCollection.MyFilter(P1);
    public class MyClass
    {
        public string P1 { get; set; }
    }

    public static class QueryableExtensions
    {
        public static IQueryable<T> MyFilter<T>(this IQueryable<T> queryable, string value) where T : MyClass
        {
            return queryable.Where(arg => arg.P1 == value);
        } 
    }