У меня есть таблица данных под названием 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
@Beto, поскольку ваше новое условие добавляется с помощью оператора &&, это новое условие никоим образом не добавит строку. Это вернет только те строки, которые соответствуют обоим условиям.





Прежде всего, нужно знать, какой метод вызывает исключение.
В вашем случае метод 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();
}
У вас есть данные, которые соответствуют обоим условиям?