【问题标题】:AND operator in Linq Query with DataTable使用 DataTable 的 Linq 查询中的 AND 运算符
【发布时间】:2015-04-30 18:12:15
【问题描述】:

我想从 DataTable 中选择一些记录并绑定到下拉列表中,有时我必须在 dataTable 中选择 where acc_id =1 ,在某些情况下我必须选择 where acc_id =1 和 acc_id=5 。 我如何使用 && 运算符,如果只有一个条件,则以下查询运行良好。如果我添加 AND(&&) 运算符在结果集中没有任何结果。

   DataTable dt = new DataTable();
        dt = ds.Tables[0];
        var query = from a in dt.AsEnumerable()
                    where a.Field<Int64>("acc_id") == 1 && a.Field<Int64>("acc_id") == 5
                    select a;

        dt = query.CopyToDataTable();
        ddlAccount.DataSource = dt;
        ddlAccount.DataTextField = "account_name";
        ddlAccount.DataValueField = "acc_id";
        ddlAccount.DataBind();

帮帮我。

【问题讨论】:

  • acc_id 怎么可以同时是 5 和 1?你希望它会满足。
  • 避免这种混淆的一种方法是使用所需 id 的集合:int[] ids = {1,2}; .... where ids.Contains(a.Field&lt;Int64&gt;("acc_id"))
  • 谢谢大家,有点困惑 ;)
  • 嗨@TimSchmelter 谢谢。

标签: c# linq datatable


【解决方案1】:

如前所述,您应该使用or,而不是and 运算符。

顺便说一句,如果您希望接受的acc_id 列表更加动态(例如来自参数),您也可以这样做

var ids = new[]{1, 5};//this could be passed as parameter to a method

然后

var query = dt.AsEnumerable()
              .Where(m => ids.Contains(m.Field<Int64>("acc_id")));

当然

   var query = from a in dt.AsEnumerable()
               where ids.Contains(a.Field<Int64>("acc_id"))
               select a

【讨论】:

  • @Md.ParvezAlam:它不是string,也不是String.Contains,而是int[]Enumerable.Contains,它检查集合是否至少包含一个给定的int。因此,如果是 15,则不会返回该行,因为 15 既不是 1 也不是 5。
【解决方案2】:

作为记录,acc_id 一次可以是 15 一个,而您的条件说 acc_id 应该是 15 在同时(这是不可能的)。所以你需要使用或运算符|| 而不是和运算符&amp;&amp;。现在它将带来acc_id 1或5的记录

var query = from a in dt.AsEnumerable()
                    where a.Field<Int64>("acc_id") == 1 || a.Field<Int64>("acc_id") == 5
                    select a;

【讨论】:

    【解决方案3】:

    你可能想使用or,因为acc_id不能同时是1和5。

    where a.Field<Int64>("acc_id") == 1 || a.Field<Int64>("acc_id") == 5
    

    【讨论】:

      【解决方案4】:

      扩展我的评论,您需要一个Or 运算符而不是And:-

      var query = from a in dt.AsEnumerable()
                          where a.Field<Int64>("acc_id") == 1 || a.Field<Int64>("acc_id") == 5
                          select a;
      

      【讨论】:

        【解决方案5】:

        如果您想检索 acc_id == 1acc_id == 5 的记录,您应该使用 OR。

        如果使用 AND 运算符, 当第一个条件acc_id == 1时,那么匹配的记录一定是"acc_id = 1

        现在,第二个条件acc_id ==5,一个acc_id = 1怎么能通过acc_id == 5的过滤器?

            DataTable dt = new DataTable();
            dt = ds.Tables[0];
            var query = from a in dt.AsEnumerable()
                        where a.Field<Int64>("acc_id") == 1 || a.Field<Int64>("acc_id") == 5
                        select a;
        
            dt = query.CopyToDataTable();
            ddlAccount.DataSource = dt;
            ddlAccount.DataTextField = "account_name";
            ddlAccount.DataValueField = "acc_id";
            ddlAccount.DataBind();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多