LINQ Query с входом Array и переменной Where Statements - Совет - PullRequest
3 голосов
/ 15 июля 2010

Я бы хотел запросить данные по массиву для фильтрации через службы данных WCF с помощью клиентского API Silverlight. По сути, я хочу запросить сотрудников по списку (массиву) состояний.

Я думаю что-то вроде этого:

public IQueryable<Employee> Load(string[] states)
{
     foreach (var x in states)
     {
           // LINQ query here with 1 to N .Where statements
           return from e in Context.Employees
           .Where(...)
     }
} 

Итак, допустим, в моем массиве есть 2 элемента, т.е. я хочу запросить по 2 состояниям, я бы сделал что-то подобное вручную:

return from e in Context.Employees
    .Where(e => e.State== states[0] || e.State == states[1])));

Любой совет будет с благодарностью!

Ответы [ 3 ]

5 голосов
/ 15 июля 2010

Вы можете динамически построить дерево выражений для условия.

var parameter = Expression.Parameter(typeof(Employee), "employee");

Expression condition = Expression.Constant(false);

foreach (var state in states)
{
    condition = Expression.OrElse(
        condition,
        Expression.Equal(
            Expression.Property(parameter, "State"),
            Expression.Constant(state)));
}

var expression = Expression.Lambda<Func<Employee, Boolean>>(condition, parameter);

И затем просто выполнить вызов.

var result = Context.Employees.Where(expression);

Я не уверен на 100%, сработает ли этоиз коробки для вас, но я надеюсь, что общая идея помогает.

1 голос
/ 15 июля 2010

Context.Employees.ToList (). Где (x => states.Contains (x.State))

0 голосов
/ 15 июля 2010

Вот пригодный пример, который, я думаю, делает то, что вы хотите? Имея список штатов, он даст вам сотрудников, которые находятся в этих штатах.

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> states = new List<string>();
            states.Add("SC");
            states.Add("TX");
            states.Add("NC");

            List<Employee> emps = new List<Employee>();
            emps.Add(new Employee() { State = "GA", Name = "Bill" });
            emps.Add(new Employee() { State = "TX", Name = "John" });
            emps.Add(new Employee() { State = "SC", Name = "Mary" });

            //Here's where the work is done.  The rest is fluff...
            var empsinstates = from e in emps where states.Contains(e.State) select e;

            foreach (var e in empsinstates)
            {
                Console.WriteLine(e.Name + " " + e.State);
            }
            Console.Read();
        }
    }
    class Employee
    {
        public string State;
        public string Name;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...