读书人

请问一上linq联合查询的有关问题小弟

发布时间: 2012-12-14 10:33:08 作者: rapoo

请教一下linq联合查询的问题,我这里用两个DataTable进行联合查询,速度特别慢。
不知道是什么原因,速度非常慢。功能是查出两个表之间相同数量的数据。联合条件是Warehouse,storage和MaterialCode相等。qty和wayqty其中有一个符合就行。

C# code
        static void Main(string[] args)        {DataTable dt1 = GetTable();            DataTable dt2 = GetTable();            int listCount = 10000;            Random random = new Random();            for (int i = 1; i <= listCount; i++)            {                DataRow row = dt1.NewRow();                row["Warehouse"] = "100" + random.Next(2).ToString();                row["storage"] = "100" + random.Next(3).ToString();                row["MaterialCode"] = i.ToString();                row["Qty"] = random.Next(10);                row["WayQty"] = 10;                //row["WayQty"] = random.Next(1);                dt1.Rows.Add(row);            }            Random random1 = new Random();            for (int i = 1; i <= listCount; i++)            {                DataRow row = dt2.NewRow();                row["Warehouse"] = "100" + random1.Next(2).ToString();                row["storage"] = "100" + random1.Next(3).ToString();                row["MaterialCode"] = i.ToString();                row["Qty"] = random1.Next(10);                row["WayQty"] = 10;                //row["WayQty"] = random1.Next(1);                dt2.Rows.Add(row);            }            //Linq的测试方式            Stopwatch linq_Stopwatch = new Stopwatch();            linq_Stopwatch.Start();            var linqList = from a in dt1.AsEnumerable()                           join s in dt2.AsEnumerable() on a.Field<string>("Warehouse") equals s.Field<string>("Warehouse")                           where a.Field<string>("storage").Equals(s.Field<string>("storage"))                           && a.Field<string>("MaterialCode").Equals(s.Field<string>("MaterialCode"))                           && (                           a.Field<int>("Qty") == s.Field<int>("Qty")                           || a.Field<int>("WayQty") == s.Field<int>("WayQty")                           )                           select a;            int count = linqList.Count();            linq_Stopwatch.Stop();}        static DataTable GetTable()        {            DataTable dt = new DataTable();            DataColumn col1 = new DataColumn("Warehouse", typeof(string));            DataColumn col2 = new DataColumn("storage", typeof(string));            DataColumn col3 = new DataColumn("MaterialCode", typeof(string));            DataColumn col4 = new DataColumn("Qty", typeof(int));            DataColumn col5 = new DataColumn("WayQty", typeof(int));            dt.Columns.Add(col1);            dt.Columns.Add(col2);            dt.Columns.Add(col3);            dt.Columns.Add(col4);            dt.Columns.Add(col5);            return dt;        }

读书人网 >.NET

热点推荐