Как создать динамический запрос, когда есть условие, которое не использует все поля в секции where с LinQ - PullRequest
0 голосов
/ 20 октября 2011

Я использую объект данных из БД и доменную службу.

Я использую сгенерированный код .net для простых запросов, например,

public IQueryable<employee> GetEmployeesByLocale(int localeID)
{
    return ObjectContext.employees.Where(e => e.Locale_ID == localeID);
}

Теперь янеобходимо соответственно изменить раздел .Where , чтобы:

if (localeID > 0)
{
    ['Where' should be like .Where(e => e.Locale_ID == localeID)];
}
if (projectID > 0)
{
    [IF localeID == 0, 'Where' should be like .Where(e => e.Project_ID == projectID)
    Else if localeID > 0, Where should use both, sort of .Where(e => e.Locale_ID == localeID && e.Project_ID == projectID)];
}

и т. д. с другими переменными.

Существует много возможных комбинаций, поэтому я и былпытаясь использовать перегрузку для .Where (строка, параметр [])

string q = string.Empty;
if (localeID > 0)
{
    q = "Locale_ID = " + localeID.ToString();
}

if (projectID > 0)
{
    q = q == string.Empty ? "Project_ID = " + projectID.ToString() : q + " and " + "Project_ID = " + projectID.ToString();
}
... (for other variables and fields)
...
System.Data.Objects.ObjectParameter[] param = new System.Data.Objects.ObjectParameter[1];
param[0] = new System.Data.Objects.ObjectParameter("param", 1);
return ObjectContext.employees.Where(q, param);

Однако, это только дает ошибку, потому что тогда все имена полей предположительно выходят за рамки/ несуществующие.Даже если в строке используются сотрудники. [Field_name], они «не существуют»

Кто-нибудь знает способ использования условных выражений внутри .Где часть запроса?Или как создать какую-нибудь переменную или объект, содержащий мой запрос, чтобы я мог просто разобрать его?

1 Ответ

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

Вы можете использовать

IQueryable<Employee> emp =  ObjectContext.employees;
if (localeID > 0)  
    emp=emp.Where(e => e.Locale_ID == localeID).AsQueryable();  

if (projectID > 0)  
    emp=emp.Where(e => e.Project_ID == projectID).AsQueryable();  

Это объединит предложения where

...