有什么方法可以将LINQ表达式存储为属性?

时间:2011-10-06 13:23:29

标签: c# linq properties

基本上,我希望能够创建一个Object并将LINQ查询作为属性传递给它并存储该属性......

我知道我总是可以在想要过滤集合的代码中运行LINQ查询,但我认为如果我的Object可以保留该查询以便引用它的其他类可以获取该查询,那将会很有趣。 ..


伪代码

public class MyClass
{
    public MyClass(?? linq)
    {
        TheLinq = linq;
    }

    public ?? TheLinq { get; set; }

}

3 个答案:

答案 0 :(得分:1)

听起来你想要的东西非常接近以下内容:

public class Program {
  private static void Main(string[] args) {
    Func<List<string>, IEnumerable> testQuery = x => x.Where<IEnumerable>(y => !y.Equals("Yucky"));
    var testArray=new string[] {"Hello", "Yucky", " ", "World"};

    var testClass=new MyClass(testQuery);
    var resultStrings = testClass.query(testArray.ToList());

    // Printing resultStrings should result in "Hello World"
    foreach (string s in resultStrings) {
       Console.Write(s);
    }
   }
}


public class MyClass {
  public Func<List<string>, IEnumerable> query { get; private set; }

  public MyClass(Func<List<string>, IEnumerable> aQuery)
  {
    query=aQuery;
  }
}

编辑:已检查,是的,这确实有效

一般情况下,您需要根据自己的喜好来定制Func<input, output>,但这应该非常适合您,我应该这么想!

只是为了一点点的可读性,这里的func可以用不那么模糊的变量名重写,例如:Func<List<string>, IEnumerable> testQuery = theListToQuery => theListToQuery.Where<IEnumerable>(stringInList => !stringInList.Equals("Yucky"));

答案 1 :(得分:0)

如果您要保留查询表达式并对其进行操作,请考虑以下事项:

public class MyClass 
{ 
    public MyClass(IQueryable<MyClass> linq) 
    { 
        TheLinq = linq; 
    } 

    public IQueryable<MyClass> TheLinq { get; set; } 

} 

答案 2 :(得分:0)

我认为你正在寻找使用表达树。 Expression对象(expr和expr1)是您尝试在上面解释的类型的实例。这些表达式对象可以根据需要传递和编译:

            List<int> ints = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9};

        Expression<Func<IEnumerable<int>, IEnumerable<int>>> expr = x=> x.Where(y=> y>6);

        Expression<Func<IEnumerable<int>, IEnumerable<IGrouping<bool,int>>>> expr1 = x => x.GroupBy(y => y > 6);

        // first expression
        var bobs = expr.Compile()(ints);

        foreach(var bob in bobs)
        {
            Console.WriteLine(bob);
        }
        // second expression
        var bobs1 = expr1.Compile()(ints);
        int counter = 0;
        foreach (IGrouping<bool, int> bob in bobs1)
        {
            Console.WriteLine("group " + counter++ + " values :");
            foreach (var t in bob)
            {
                Console.WriteLine(t);
            }

        }