Динамические выражения в предложении «Где» - Linq to SQL - PullRequest
4 голосов
/ 12 июля 2011

Я новичок в LINQ, поэтому надеюсь, что это не глупый вопрос:

У меня есть таблица с большим количеством контента, представленного в сетке данных, и я хочу, чтобы пользователь мог фильтроватьсетку, используя несколько полей со списком над сеткой [например, панель поиска]

Я создал метод, который берет текст в поля со списком и помещает его в предложение «Где»:

    public void find()
    {
        string disName;
        string statusName;


        disName = RMcmbDis.Text; //This Get the first string to filter
        statusName = RMcmbStatus.Text; // this get the second string to filter

// Здесь я собираю все необходимые данные

        var allCNT = from x in cntDB.releases
                     join dis in cntDB.disciplines on x.discipline equals dis.discipline_id
                     join btch in cntDB.batches on x.batch_num equals btch.batch_id
                     join z in cntDB.status on x.status equals z.status_id

                     select new { dis.discipline_name, x.grade, x.batch_num, btch.batch_name, z.status_description, x.segment_leader, x.ped_leader, x.release_location, x.comments, x.QA_Verdict };

// Здесь я делаю фильтрацию

        var find = allCNT.Where(a => a.discipline_name == disName && a.status_description == statusName);


        dataGridView1.DataSource = find;
    }

Теперь у меня проблема: я хочу, чтобы пользователь былвозможность оставить одно из полей со списком пустым, и если он это сделает, это означает, что он не хочет фильтровать этот критерий.[EG - Комбо «RMcmbDis» имеет «Math», а комбо «Status» [«RMcmbStatus»] пусто, поэтому сетка будет отображать только «Math» во всех статусах ».

Как мне это сделать?Спасибо, ребята ... Н.

Ответы [ 2 ]

6 голосов
/ 12 июля 2011

Вы можете просто добавить Where() предложения, если вы хотите, чтобы условие выполнялось ...

var results = allCNT;

if (!string.IsNullOrEmpty(disName))
    results = result.Where(a => a.discipline_name == disname);

if (!string.IsNullOrEmpty(statusName))
    results = results.Where(a => a.status_description == statusName);

dataGridView1.DataSource = results;

См. Комментарий ниже для одного варианта для обработки большого количества фильтров. Другой вариант - использовать вспомогательный метод:

T AddFilter<T>(IQueryable<T> results, string filterValue, Expression<Func<T, bool>> predicate)
{
    if(!string.IsNullOrEmpty(filterValue))
        return results.Where(predicate);
    return results;
}

Что бы вы использовали, как это:

var results = allCNT;
results = AddFilter(results, disname, a => a.discipline_name == disname);
results = AddFilter(results, statusName, a => a.status_description == statusName);
results = AddFilter(results, whatever, a => a.whatever == whatever);
// ...
dataGridView1.DataSource = results;
3 голосов
/ 12 июля 2011

Вы можете добавить несколько предложений Where в зависимости от ваших критериев, например:

var find = allCNT;
if (!string.IsNullOrEmpty(disName))
{
    find = find.Where(a => a.discipline_name == disName);
}
if (!string.IsNullOrEmpty(statusName))
{
    find = find.Where(a.status_description == statusName);
}
...