none
DataTable转换成匿名List<T> RRS feed

答案

  • 你好,

    我现在不是很理解你的需求,你能够再详细描述在你的问题吗?

    这个是从内存查询的,我建议你只执行一次tolist。

    然后再在第二个查询中查询这个list,这个逻辑应该没问题。

    另外,我优化了一下代码,你可以参照下面的:

    var list = null 
    await Task.Run(() =>
                              {
                                 list =  dtype.ToList();
                                  dt = list.ToDataSet().Tables[0];
                              });
    
                    await Task.Run(() =>
                    {
                      var result = list.Skip(pagerControl1.PageSize * (pagerControl1.PageIndex - 1)).Take(pagerControl1.PageSize).ToList();
                    });
    

    List查询出来后放到了内存中,方便下次直接调用。


    如果觉得我的回复对你有帮助的话,请把它标记为答案。


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 lctk 2016年12月8日 23:58
    2016年12月6日 7:34

全部回复

  • 你好,

    根据你的描述,我并能理解你的需求是什么。

    如果你只是需要使用LINQ的话,我建议你可以使用datatable的AsEnumerable方法然后再使用Tolist方法就变成了一个LIST.

    具体你可以参照如下代码:

      DataTable dt = new DataTable();
                var result = dt.AsEnumerable().ToList();


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年11月30日 8:02
  • 需求就是这样的:

    我用linq查询出来个匿名类,绑定到控件上,

         var dtype = from c in hp
                            join p in di on c.DeviceId equals p.ID
                            join d in st on p.StationId equals d.Id
                          
                            select new
                            { 。。。。。。。。}

     dgvHistory.DataSource = dtype.tolist();

    但是这个查询速度非常慢,又用不了sql语句,所以我就查询的时候弹出一个图片:

    但是这个查询会阻塞图片,所以我是这么写的

    await Task.Run(() => { var list = dtype.ToList(); dt = list.ToDataSet().Tables[0]; }); await Task.Run(() => { dtype = dtype.Skip(pagerControl1.PageSize * (pagerControl1.PageIndex - 1)).Take(pagerControl1.PageSize).ToList(); });

      dgvHistory.DataSource = dtype;

    这个 dt = list.ToDataSet().Tables[0];(导出excel)

    就是一个datatable,我准备把它转换成list,用到第二个分页查询里面,省的在tolist()

    你可以使用datatable的AsEnumerable方法然后再使用Tolist方法就变成了一个LIST.

    这个不可以啊,AsEnumerable方法然后再使用Tolist方法就变成了一个LIST,list变成null了



    please verify my account

    2016年11月30日 8:25
  • 你好,

    根据你的描述,我觉得问题不在tolist方法上,tolist方法执行的速度是非常快的。

    但是你的LINQ语句是延迟查询的,所以当你调用 dtype.ToList();这段代码的时候,相当于重新查询了一遍,所以很慢。

    我建议你可以把 var list = dtype.ToList();这句放在代码外面。

    在Task.Run中直接调用list就不会出现每使用一次就查询数据库。

    类似于这样:

    var list = dtype.ToList();
    await Task.Run(() =>
                              {
                                  dt = list.ToDataSet().Tables[0];
                              });
    
                    await Task.Run(() =>
                    {
                      var result = list.Skip(pagerControl1.PageSize * (pagerControl1.PageIndex - 1)).Take(pagerControl1.PageSize).ToList();
                    });

    这样应该就可以解决你问题。


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年12月5日 2:14
  • var dtype = from c in hp join p in di on c.DeviceId equals p.ID join d in st on p.StationId equals d.Id select new { 。。。。。。。。}

    嗨,我现在操作的是内存的数据,但是数据比较多,速度慢


    please verify my account

    2016年12月5日 3:21
  • 你好,

    我现在不是很理解你的需求,你能够再详细描述在你的问题吗?

    这个是从内存查询的,我建议你只执行一次tolist。

    然后再在第二个查询中查询这个list,这个逻辑应该没问题。

    另外,我优化了一下代码,你可以参照下面的:

    var list = null 
    await Task.Run(() =>
                              {
                                 list =  dtype.ToList();
                                  dt = list.ToDataSet().Tables[0];
                              });
    
                    await Task.Run(() =>
                    {
                      var result = list.Skip(pagerControl1.PageSize * (pagerControl1.PageIndex - 1)).Take(pagerControl1.PageSize).ToList();
                    });
    

    List查询出来后放到了内存中,方便下次直接调用。


    如果觉得我的回复对你有帮助的话,请把它标记为答案。


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 lctk 2016年12月8日 23:58
    2016年12月6日 7:34
  • var list = null

    编译不过去吧,

    这个是从内存查询的,我建议你只执行一次tolist。

    然后再在第二个查询中查询这个list,这个逻辑应该没问题

    我也是这么想的啊,我又建了一个类,专门用于这个操作


    please verify my account

    2016年12月6日 7:44
  • 你好,

    不好意思,应该是new一个新的类,然后继续做操作。


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年12月6日 8:53