2016-10-05 3 views
1

У меня есть некоторые параметры фильтра в Controller проекта ASP.NET MVC, и мне нужно создать динамическое предложение Where в соответствии с этими параметрами. Если параметр isActive равен true, он получит записи, имеющие StatusId = 1. Существуют также параметры userName и labId в методе, которые должны быть сопоставлены в предложении Where.Динамическое предложение Where в выражении Lambda

public ActionResult GetStudents(int labId, string userName, bool isAll) 
{ 
    var allRecords = repository.Students; 
    //If isAll, get all the records having StatusId = 1 
    var result = allRecords.Where(m => (isAll) || m.StatusId == 1); 
    //??? 
} 

Я использую фильтр выше, но я понятия не имею, что является наиболее подходящим способом (конвенция) для нескольких параметров для того, чтобы получить результат быстро. Есть идеи?

Примечание: Я хочу фильтр для всех трех параметров и где предложение должно содержать все комбинации в соответствии со значениями параметра (также равно нулю или пусто).

+2

'если (isAll) {allRecords = allRecords.Where (т => m.StatusId == 1; } else {..} ' –

+1

Несколько предложений' Where' объединены * и *. Таким образом, вы можете добавить их так, как вам нужно, как показал @StephenMuecke. –

+0

@StephenMuecke Не могли бы вы разместить полную статью, добавив ее в другие параметры? Потому что комбинации labId и userName меня смущают. –

ответ

1

ли так

public ActionResult GetStudents(int labId, string userName, bool isAll) 
{ 
    var allRecords = repository.Students; 
    //If isAll, get all the records having StatusId = 1 
    if (isAll) 
    { 
     var result = allRecords.Where(m => m.StatusId == 1 && m.UserName == userName && m.LabId == labId); 
    } 
    else 
    { 
     // do else things 
    } 
} 
+0

Не могли бы вы опубликовать полную статью, добавив ее к другим параметрам? Потому что комбинации labId и userName меня смущают. –

+0

ok см. Обновление сейчас – Mostafiz

+0

Хотя я следил за подходом, показанным StephenMuecke, проголосуйте за свой ответ, поскольку это также полезно. Спасибо ... –

2

Вы можете сцепить Linq-методы, поскольку все они возвращают IEnumerable<T> и объединяются с помощью что-то вроде SQL- And (dependinng на то, что LINQ-провайдера, который Вы используете):

IEnumerable<Student> result = allRecords; 
if(labelId.HasValue) 
    result = result.Where(x => x.LabelId == labelId); 
else 
    result = result.Where(x => x.LabelId == 0); // or whatever your default-behaviour is 

if(isAll) 
    result = result.Where(x => x.StatusId == 1); 
else 
    result = result.Where(x => x.StatusId == 0); // or whateever your default-behaviour is when isAll is false 

if(!String.IsNullOrEmpty(userName)) 
    result = result.Where(x => x.Name == userName); 
else 
    result = result.Where(x => x.Name == "Claus"); // or whatever the default-behaviour is when the param isn´t set 
+0

Не могли бы вы разместить полную статью, добавив ее в параметр labId? Спасибо ... –

+0

@ClintEastwood Сделано так, см. Первую строку кода – HimBromBeere

+0

Несмотря на то, что я следовал подходу StephenMuecke, проголосуйте за свой ответ, поскольку это также полезно. Спасибо ... –

1

вам нужно что-то вроде ниже

public ActionResult GetStudents(int labId, string userName, bool isAll) 
{ 
    var allRecords = repository.Students; 
    //If isAll, get all the records having StatusId = 1 
    if (isAll) 
    { 
     var result = allRecords.Where(m => m.StatusId == 1 
              && m.LabId == labId 
              && m.UserName == username); 
     //or 
     var result = from record in allRecords 
         where record != null && 
           record.StatusId == 1 
           && !string.IsNullOrWhiteSpace(record.UserName) 
           && record.UserName.Equals(username) 
           && record.Labid = labId 
         select record; 
    } 
    else 
    { 
     // do else things 
    } 
} 
+0

Я хочу фильтровать для всех трех параметров, а предложение Where должно содержать все комбинации в соответствии с значениями параметра (также является нулевым или пустым). –

+0

вы можете связать все ваши булевы условия, как показано выше. –

+0

Несмотря на то, что я следил за подходом Стивена Мукека, проголосуйте за свой ответ, поскольку это также полезно. Спасибо ... –

1
var predicate = PredicateBuilder.False<Record>(); 

if(isAll) 
    predicate = predicate.AND(d => d.StatusId ==1); 

predicate = predicate.AND(d => d.labID == labid && d.username = username); 

return allRecords.Where(predicate);` 

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

+1

Спасибо за ответ, но я не думаю, что использовать внешний инструмент в качестве предиката-строителя. –

+0

И если вы посмотрите на https://github.com/aspnetboilerplate/aspnetboilerplate/issues/699, вы увидите, что построитель предикатов взят немного дальше. – TheEdge