Как создать динамический запрос, когда есть условие, которое не будет использовать все поля в разделе where с помощью LinQ

#sql #linq #entity-framework #frameworks #entity

#sql #linq #entity-framework #фреймворки #сущность

Вопрос:

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

Я использую сгенерированный .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 amp;amp; e.Project_ID == projectID)];
}
  

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

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

 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);
  

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

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

Ответ №1:

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

 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

Комментарии:

1. большое вам спасибо. Я не смог получить какую-либо информацию, которая казалась полезной где-либо еще.