连接2数据表和条件caluse LINQ

时间:2016-11-03 04:59:18

标签: c# linq

嗨,我有2个这样的数据表

dt1
id (1,2,3)
name (abc,xyz,def)
num(11,12,13)

dt2
id (1,2,3)
name (abc,xyz,def)
num_from (10,13,11)
num_to   (14,14,14)

如何使用linq选择num_from和num_to之间具有num的id 我试过这个

dtres = (from t1 in dt1.AsEnumerable()
        join t2 in dt1.AsEnumerable() on t1.Field<string>("ID") equals t2.Field<string>("ID")
                         where t1["num"]>= t2["num_from"]  &&
                         t1["num"]<= t2["num_to"]
                         select t1).CopyToDataTable();

2 个答案:

答案 0 :(得分:0)

请考虑以下代码:

它生成的结果为IEnumerable<AnonymousType>,而不是DataRow,因此无法应用CopyToDataTable()扩展方法,而是在此代码的底部提供了自定义扩展方法{{1} },你可以改变最终结果中的列数,我已经包含了所有内容。

我对您的问题的理解是,您需要一个过滤器,ToDataTable中的Num位于DataTable1

中的Num_FromNum_To之间
Datatable2

将IEnumerable转换为DataTable的扩展方法

 var resultDataTable = 
    dt1.AsEnumerable().Join(dt2.AsEnumerable(), t1 => t1["id"], t2 => t2["id"], (t1, t2) => new { t1, t2})
                      .Where(t => (int.Parse(t.t2["num_from"].ToString()) <= int.Parse(t.t1["num"].ToString()) && int.Parse(t.t2["num_to"].ToString()) >= int.Parse(t.t1["num"].ToString())))
                      .Select(t => new { 
                                                     Id1 = t.t1["id"].ToString(), 
                                                     Name1 = t.t1["name"].ToString(), 
                                                     Num1 = t.t1["num"].ToString(), 
                                                     Id2 = t.t2["id"].ToString(), 
                                                     Name2 = t.t2["name"].ToString(), 
                                                     Num_From = t.t2["num_from"].ToString(), 
                                                     Num_To = t.t2["num_to"].ToString()
                                        }
                             ).ToList().ToDataTable();

答案 1 :(得分:0)

不能像在Mysql和sql上那样在Linq数据库上创建连接操作。但是你可以创建一个简单的函数来帮助你做到这一点。您将需要一个函数来为您返回字符串或整数:

   private ObservableCollection<Var_Items> _var_ItemsList;
        public ObservableCollection<Var_Items> Var_ItemsList
        { get { return _var_ItemsList; } 
        set { _var_ItemsList = value;
              NotifyPropertyChanged("Var_ItemsList"); 
        } 
       }

    dtres = from t1 in dt1.AsEnumerable() where t1["num"]>= getMyVar1(t1["num"]) and t1["num"]<= getMyVar1(t1["num"]) select t1;


        public string getMyVar1(int find_var)
        {
            var thisvar = from t2 in dt2.AsEnumerable() where t2["num_from"] >= find_var select t2;
            varitems = new ObservableCollection<Var_Items>(Var_ItemsList);
            return varitems.Last();
        }

        public string getMyVar2(int find_var)
        {
            var thisvar = from t2 in dt2.AsEnumerable() where t2["num_to"] >= find_var select t2;
            varitems = new ObservableCollection<Var_Items>(Var_ItemsList);
            return varitems.Last();
        }

我试图简化我的回答以便更容易理解。我希望这有帮助