CSDN-CSDN社区-.NET技术-LINQ

收藏 如何用 linq 查询 结果 到 Dataset?[问题点数:20]

楼主发表于:2008-03-19 17:07:45
如何用 linq 查询 结果 到 Dataset或者DataTable?
回复次数:24
#1楼 得分:0回复于:2008-03-19 17:14:14
Mark
  • vrhero用户头像
  • vrhero
  • (吾以吾学知吾所学之浅也...)
  • 等 级:
#2楼 得分:0回复于:2008-03-19 17:40:42
如果你喜欢DataSet或者DataTable...就别学LINQ...
  • liao8735用户头像
  • liao8735
  • (徘徊在梦的边缘...)
  • 等 级:
#3楼 得分:0回复于:2008-03-19 17:42:31
引用 2 楼 vrhero 的回复:
如果你喜欢DataSet或者DataTable...就别学LINQ...
  • sp1234用户头像
  • sp1234
  • (大家都学滤霸流氓软件的设计思路)
  • 等 级:
#4楼 得分:0回复于:2008-03-20 04:04:38
写一个例子,假设要把查询出来的 MySimpleType 类型的数据集合转换为DataTable,可以写:


public static class Ext
{
    public static DataTable Convert(this IEnumerable <mySimpleType> obj)
    {
        var ret = new DataTable();
        ret.Columns.Add("name", typeof(mySimpleType).GetField("name").FieldType);
        ret.Columns.Add("date", typeof(mySimpleType).GetField("date").FieldType);
        ret.Columns.Add("doc", typeof(mySimpleType).GetField("doc").FieldType);
        foreach (var item in obj)
        {
            DataRow r = ret.NewRow();
            r["name"] = item.Name;
            r["date"] = item.Date;
            r["doc"] = item.Doc;
            ret.Rows.Add(r);
        }
        return ret;
    }

}

public class mySimpleType
{
    public string Name;
    public DateTime Date;
    public List <System.Xml.XmlDocument> Doc;

}


在主程序中,你可以写:

var search = from r in MyDataSource
            where r.Name.StartsWith("wu") && r.Date >= DateTime.Parse("2008/1/10")
            select r;
DataTable table=search.Convert();
  • sp1234用户头像
  • sp1234
  • (大家都学滤霸流氓软件的设计思路)
  • 等 级:
#5楼 得分:0回复于:2008-03-20 04:09:50
我有3年没有用过dataset了,因为它不清爽。

知道daatset结构中包括什么,可以很容易开始使用它。但是它不能在编译时就给你检查出设计错误,开发效率不高。
  • sp1234用户头像
  • sp1234
  • (大家都学滤霸流氓软件的设计思路)
  • 等 级:
#6楼 得分:0回复于:2008-03-20 04:27:54
嗯,呵呵,DataTable的类型比较散,所以也可以写得相当随意,甚至不需要预先知道 MySimpleType 类型的细节:

public static class Ext
{
    public static DataTable ConvertFrom3Fields <T>(this IEnumerable <T>  obj)
    {
        var ret = new DataTable();
        ret.Columns.Add("name", typeof(T).GetField("name").FieldType);
        ret.Columns.Add("date", typeof(T).GetField("date").FieldType);
        ret.Columns.Add("doc", typeof(T).GetField("doc").FieldType);
        foreach (var item in obj)
        {
            DataRow r = ret.NewRow();
            r["name"] = item.Name;
            r["date"] = item.Date;
            r["doc"] = item.Doc;
            ret.Rows.Add(r);
        }
        return ret;
    }

}

主程序中就写:

var search = from r in MyDataSource  //数据源是 MySimpleType类型的数据的集合
            where r.Name.StartsWith("wu") && r.Date > = DateTime.Parse("2008/1/10")
            select r;
DataTable table=search.ConvertFrom3Fields();
  • sp1234用户头像
  • sp1234
  • (大家都学滤霸流氓软件的设计思路)
  • 等 级:
#7楼 得分:0回复于:2008-03-20 04:32:54
哦不,应该反射了:

              DataRow r = ret.NewRow(); 
            r["name"] = typeof(T).GetField("Name").GetValue(item); 
            r["date"] = typeof(T).GetField("Date").GetValue(item); 
            r["doc"] = typeof(T).GetField("Doc").GetValue(item); 
            ret.Rows.Add(r); 

还应该改为将反射结果缓存起来复用。不过,还是算了,既然已经有了第一种答案,就用它吧。
#8楼 得分:0回复于:2008-03-20 08:34:35
mark~
  • beyondtkl用户头像
  • beyondtkl
  • (大龙驹<*做正确的事,正确的做)
  • 等 级:
#9楼 得分:0回复于:2008-03-20 17:09:40
:-) nice.
#10楼 得分:0回复于:2008-03-31 17:42:49
LINQ是没有办法的

不过你可以用IBatisNet在FortuneBase修改的方式
Mapper.QueryForDataTable...

参考地址
http://www.cnblogs.com/mail-ricklee/archive/2008/03/06/1093260.html
  • srym用户头像
  • srym
  • (Rapidly_love)
  • 等 级:
#11楼 得分:0回复于:2008-03-31 21:28:53
感觉用LINQ就要抛弃以前的ADO.NET  不应该在去想Dataset  建议LZ好好去看看LINQ。然后就明白了。
  • NeuMik用户头像
  • NeuMik
  • (旋律)
  • 等 级:
#13楼 得分:0回复于:2008-04-14 11:01:49
取出来的数据重新添加进去吧····
#14楼 得分:0回复于:2008-04-18 23:10:22
学习
#15楼 得分:0回复于:2008-05-01 09:34:38
我也想知道,正在找這方面的資料~~~~~
#16楼 得分:0回复于:2008-10-24 16:33:14
其实我们也不想用DataSet啊。但是用LINQ对GridView排序和分页不好处理。
这个问题我一直没研究明白。请各位大师赐教。
#17楼 得分:0回复于:2008-10-26 12:19:25
Linq to SQL确实需要foreach结果集合,然后一行行生成Datatable,不过Linq to Accsess是用的Linq to Dataset,生成的结果就是Datatable和Datarow
DatagridView我好久没用了,我现在都是用的DevExpress控件集合,其中的GridControl非常好用,不过DataGridView绑定Linq的结果集也一样好用啊,不知道你是没研究明白什么?
  • wangping_li用户头像
  • wangping_li
  • (总有一天,我星球上的人会来接我)
  • 等 级:
#18楼 得分:0回复于:2009-03-13 11:19:08
引用 16 楼 jenny_537 的回复:
其实我们也不想用DataSet啊。但是用LINQ对GridView排序和分页不好处理。
这个问题我一直没研究明白。请各位大师赐教。


用了Linq To DataSet还有什么不好处理的?
如果要排序:
var result=from u in ds.Tables[0].AsEnumerable()  order by u.Field <int>("ID") select u;
分页的话可以使用Take和Skip来处理的
var result=ds.Tables[0].AsEnumerable().ToList().Take(..).Skip(..)...
其实用了Linq to DataSet完全可以像操作泛型集合一样了
如查询:var quert=ds.Tables[0].AsEnumberable().Tolist().Find(delegate(DataRow obj){retutrn obj.Field <类型>("字段")=="值";});
甚至直接查询GridView的值也方便了
GridView.Columns.Cast <GridViewColumn>().ToList().Find(deletate(DataRow obj){ return obj...});

仔细看看每一个方法

  • wangping_li用户头像
  • wangping_li
  • (总有一天,我星球上的人会来接我)
  • 等 级:
#19楼 得分:0回复于:2009-03-13 11:23:33
只要转换成GridView.Columns.Cast <GridViewColumn>()后
像泛型的Sort,Remove,RemoveAt,Exists,Find,FindAll这些东西都好处理的
  • jl_lsj用户头像
  • jl_lsj
  • (www.yroad.cn)
  • 等 级:
#20楼 得分:0回复于:2009-03-13 16:20:25
引用 5 楼 sp1234 的回复:
我有3年没有用过dataset了,因为它不清爽。

知道daatset结构中包括什么,可以很容易开始使用它。但是它不能在编译时就给你检查出设计错误,开发效率不高。


弱弱的问一句,不用Dataset了,用什么实现把数据读到缓存中,并绑定数据集呢?
很想学习下,我感觉DataSet也不是很好用,但是一直不知道用什么替代。
#21楼 得分:0回复于:2009-04-27 14:48:32
不错……
#22楼 得分:0回复于:2009-04-27 17:16:11
替代了 dataset
#23楼 得分:0回复于:2009-05-15 17:47:34
LINQ TO DATASET来操作DATATABLE还是比较方便的。
目前还是用datatable还作为缓存,唯一的一个不好是不能序列化。所以序列化的时候还是得用DataSet
#24楼 得分:0回复于:2009-06-20 16:04:36
学习
相关问题
linq to dataset 如何将查询结果结果转换成DataRowCollections
在C#中如何将sql查询出来的结果放到定义好的数组中
如何在DataSet中使用跨表查询
浅谈Linq To Sql集成数据库语言的优劣
浅谈Linq To Sql集成数据库语言的优劣
Linq学习笔记