Как использовать строку в предложении linq where? - PullRequest
3 голосов
/ 12 марта 2012

Я пытаюсь отправить запрос Linq в виде строки методу, который будет использоваться в предложении where. Поскольку IEnumerable не будет работать для этого, я преобразовал свой IEnumerable в IQueryable, и все равно он выдает ошибку. Ниже приведен код:

public static void  FilterData(string Query)
        {
            if((List<MemberMaintenanceData>)HttpContext.Current.Session["Allmembers"] != null)
            {
                //Get the IEnumerable object colection from session
                var data = (List<MemberMaintenanceData>) HttpContext.Current.Session["Allmembers"];
                //Convert it to IQueryable
                IQueryable<MemberMaintenanceData> queryData = data.AsQueryable();
                //This line doesn't compile!!
                queryData = queryData.Where(Query);
                HttpContext.Current.Session["Allmembers"] = queryData.AsEnumerable().ToList();
            }

        }

Я намеревался передать "a => a.AccountId == 1000" как Query

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

Существует бесплатная (с открытым исходным кодом) библиотека, предоставляемая Microsoft для анализа строк в лямбда-выражениях, которые затем могут использоваться в запросах Linq. Он также содержит версии стандартных операторов запросов, таких как Where (), которые принимают строковый параметр. Вы можете найти его , описанный в блоге Скотта Гатриса на Dynamic Linq.

Например, вы можете выполнять такие запросы (адаптировано из фрагмента ссылки Скотта Гутри)

// imagine these have come from a drop down box or some other user input...
string thingToSelectBy = "City";
string citySelectedByUser = "London";
int minNumberOfOrders = 10;

string whereClause = String.Format("{0} = @0 and Orders.Count >= @1", thingToSelectBy);

var query = db.Customers
       .Where(whereClause, citySelectedByUser, minNumberOfOrders)
       .OrderBy("CompanyName")
       .Select("new(CompanyName as Name, Phone");

Предложение Where в этом фрагменте кода показывает, как создать предложение where, используя параметризованную строку, а затем динамически вводить значения для параметров во время выполнения, например, на основе пользовательского ввода. Это работает для параметров любого типа.

В вашем примере предложение where будет

whereClause = "AccountId = 1000";

Таким образом, в действительности вы будете делать что-то вроде

var newFilteredQueryData = queryData.Where("AccountId = 1000");

Эта ссылка также содержит место, где вы можете загрузить исходный код, и подробный документ с описанием API динамического запроса и языка выражений.

1 голос
/ 12 марта 2012

Учитывая класс, такой как:

public class foo
{
  public int AccountID {get;set;}
}

Вы должны быть в состоянии сделать что-то вроде этого:

Expression<Func<foo, bool>> filter = f => f.AccountID == 1000;

И затем передать это как ваш запрос.Если это действительно нужно в виде строки, вы можете сделать это:

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