Фильтр данных по нескольким операторам

У меня есть таблица данных под названием Designs

Я фильтрую эту таблицу в зависимости от списка значений, которые я получил от пользователя

List<Guid> values = new List<Guid>();

foreach (var checkbox in cbo)
{
    //logic to fill list...
}

Как только я это сделаю, я фильтрую свою таблицу данных с помощью LINQ следующим образом:

designs = Designs.AsEnumerable()
       .Where(row => values.Contains(row.Field<Guid>("DesignGroupId"))).CopyToDataTable();

И это работает довольно хорошо. Но теперь я хочу добавить одно условие к моему запросу. Я хочу получить столбцы с полем "DesignKey" = null. Итак, я пытаюсь:

designs = Designs.AsEnumerable()
       .Where(row => values.Contains(row.Field<Guid>("DesignGroupId")) && row.Field<int>("DesignKey") == null).CopyToDataTable();

Но я получаю исключение:

System.InvalidOperationException: 'The source contains no DataRows.'

Что я делаю неправильно? С уважением

У вас есть данные, которые соответствуют обоим условиям?

Sach 15.07.2019 20:19

Да, у меня есть данные... мое второе условие просто добавить еще одну строку @Sach

Beto 15.07.2019 20:26

@Beto, поскольку ваше новое условие добавляется с помощью оператора &&, это новое условие никоим образом не добавит строку. Это вернет только те строки, которые соответствуют обоим условиям.

Martin Verjans 15.07.2019 20:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
131
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Прежде всего, нужно знать, какой метод вызывает исключение.

В вашем случае метод CopyToDatabase вызовет это исключение, как указано здесь :

InvalidOperationException

The source sequence does not contain any DataRow objects.

Чтобы убедиться, вы можете разделить свой запрос:

var designEnum= Designs.AsEnumerable();
var firstSelect = designEnum.Where(row => values.Contains(row.Field<Guid>("DesignGroupId"));
var secondSelect = firstSelect.Where(row => row.Field<int>("DesignKey") == null);
if (secondSelect.Count == 0)
{
    //Handle the fact that you have no data
    design = null;
}
else
{
    designs = secondSelect.CopyToDataTable();
}

И это гораздо проще отлаживать, так как вы можете работать с отладчиком построчно. Вы можете сжать код позже.

вы не можете CopyToDataTable null

это будет работать для вас:

void Main()
{

    DataTable Designs = new DataTable();
    Designs.Columns.Add("DesignGroupId", typeof(Guid));
    Designs.Rows.Add(Guid.NewGuid());
    Designs.Rows.Add(Guid.NewGuid());
    Designs.Rows.Add(Guid.NewGuid());
    Designs.Rows.Add(Guid.Parse("7c176832-593c-402f-9def-fbe12da3742f"));

    List<Guid> values = new List<Guid>();
    values.Add(Guid.NewGuid());
    values.Add(Guid.NewGuid());
    values.Add(Guid.NewGuid());
    //values.Add(Guid.Parse("7c176832-593c-402f-9def-fbe12da3742f"));

    var res = Designs.AsEnumerable().Where(row => values.Contains(row.Field<Guid>("DesignGroupId"))).ToList();
      if (res.Count > 0 )
        Designs =  res.CopyToDataTable();
      else
        Designs.Clear();
}

Другие вопросы по теме