Любой способ сохранить выражение LINQ как свойство? - PullRequest
2 голосов
/ 06 октября 2011

По сути, я хочу иметь возможность создать объект и передать ему запрос LINQ как свойство и сохранить это свойство ...

Я знаю, что всегда мог просто выполнить запрос LINQ в коде, который хочет отфильтровать коллекцию, но я подумал, что было бы интересно, если бы мой объект мог сохранить этот запрос, чтобы другие классы, которые ссылаются на него, могли получить этот запрос. ..


Псевдо-код

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

    public ?? TheLinq { get; set; }

}

Ответы [ 3 ]

1 голос
/ 06 октября 2011

Звучит так, будто вы хотите что-то очень похожее на следующее:

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<List<string>, IEnumerable> testQuery = theListToQuery => theListToQuery.Where<IEnumerable>(stringInList => !stringInList.Equals("Yucky"));

0 голосов
/ 07 октября 2011

Я думаю, что вы хотите использовать деревья выражений.Объекты 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);
            }

        }
0 голосов
/ 06 октября 2011

Если вы хотите сохранить выражение запроса и манипулировать им, рассмотрите следующее:

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

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

} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...