基本上,我希望能够创建一个Object并将LINQ查询作为属性传递给它并存储该属性......
我知道我总是可以在想要过滤集合的代码中运行LINQ查询,但我认为如果我的Object可以保留该查询以便引用它的其他类可以获取该查询,那将会很有趣。 ..
伪代码
public class MyClass
{
public MyClass(?? linq)
{
TheLinq = linq;
}
public ?? TheLinq { get; set; }
}
答案 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);
}
}