【问题标题】:how to write LINQ Query having multiple values from one Column?如何编写具有来自一列的多个值的 LINQ 查询?
【发布时间】:2013-11-05 08:42:32
【问题描述】:

我需要从数据表中仅从一列中查找具有多个值的数据。

下面是一个例子:

 var Value = (from r in datatable.AsEnumerable()
             where r.Field<string>(ColumnName).Contains("test1,test2")
             select r ).ToList();

这里的 ColumnName 是我的 Datatable 的列名,“test1, test2”是不同的值(值的数量是动态的,并且有“,”作为分隔符)。

我想做这个 Linq 查询,它返回数据表中所有值等于“test1”和“test2”的记录。

编辑: 上面的 LINQ 查询返回如下 SQL 查询的结果。 Select * from Table where ColumnName in ('test1','test2')

【问题讨论】:

  • 为什么在这里使用 Linq?对于这样一个简单的任务来说,完全是矫枉过正。

标签: c# linq


【解决方案1】:

使用Split + Join:

IEnumerable<string> values = "test1,test2".Split(',');
var matchingRows = from row in datatable.AsEnumerable()
                   join value in values
                   on row.Field<string>(ColumnName) equals value
                   select row;
DataTable tblResult = matchingRows.CopyToDataTable(); // or ToList

为了完整起见,less efficient 但更自然的方法使用Contains:

var matchingRows = from row in datatable.AsEnumerable()
                   where values.Contains(row.Field<string>(ColumnName))
                   select row;

【讨论】:

    【解决方案2】:

    建立一个列表:

    var filters = new [] {"test1", "test2"};
    
    var Value = (from r in datatable.AsEnumerable()
                 where filters.Contains(r.Field<string>(ColumnName))
                 select r ).ToList();
    

    这将被翻译成你想要的

    Select * 
    from Table 
    where ColumnName in ('test1','test2')
    

    【讨论】:

      【解决方案3】:

      试试这个:

      var searchParameters = new []{ "test1", "test2" }; // or "test1,test2".Split(",")
      var Value = (from r in datatable.AsEnumerable()
               where searchParameters.All(s => r.Field<string>(ColumnName).Contains(s))
               select r).ToList();
      

      【讨论】:

        【解决方案4】:

        试试这个:

        var Value = (from r in datatable.AsEnumerable()
                         where r.Field<string>(ColumnName).Contains("test1").Contains("test2")
                         select r ).ToList();
        

        【讨论】:

        • 这听起来会导致很多开销并且非常慢。
        【解决方案5】:

        干净简单的方法就是使用Select。

        示例:

        var dt = new DataTable();
        dt.Columns.Add("col1", typeof(string));
        dt.Rows.Add(new object[] {"test1"});
        dt.Rows.Add(new object[] {"test2"});
        dt.Rows.Add(new object[] {"test3"});
        dt.Rows.Add(new object[] {"test4"});
        
        // Select * from Table where ColumnName in ('test1','test2')
        var rows = dt.Select("col1 in ('test1','test2')");
        

        rows 现在是:

        【讨论】:

          【解决方案6】:

          你可以你或声明'|| '

           var Value = (from r in datatable.AsEnumerable()
                                       where r.Field<string>(ColumnName).Contains(value1) || r.Field<string>(ColumnNamedatatable).Contains(value2)
                                       select r).ToList();
          

          【讨论】:

            【解决方案7】:
            datatable.where(r=>{"test1","test2"}.Contains(r.ColumnName))
            

            【讨论】:

              猜你喜欢
              • 2021-01-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-09-10
              • 2021-12-27
              相关资源
              最近更新 更多