通过多个语句过滤数据表

时间:2019-07-15 18:14:35

标签: c# linq

我有一个名为wia的数据表

我根据从用户那里收到的值列表来过滤该表

Designs

一旦我这样做,我将使用LINQ筛选数据集:

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

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

效果很好。但是现在我想向查询添加一个条件。我想获取具有字段designs = Designs.AsEnumerable() .Where(row => values.Contains(row.Field<Guid>("DesignGroupId"))).CopyToDataTable(); 的列。所以我尝试:

"DesignKey" = null

但我有一个例外:

  

System.InvalidOperationException:“源不包含DataRows。”

我在做什么错?问候

2 个答案:

答案 0 :(得分:1)

第一件事就是知道哪个方法引发了异常。

对于您而言,如here所述,CopyToDatabase方法将引发此异常:

  

InvalidOperationException

     

源序列不包含任何DataRow对象。

为确保这一点,您可以拆分请求:

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

这很容易调试,因为您可以与调试器逐行进行。您可以稍后压缩代码。

答案 1 :(得分:0)

您不能将CopyToDataTable空

这将为您工作:

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