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

收藏 再写一个Linq使用实例:将DataTable变为强类型的数据表[问题点数:0,结帖人:sp1234]

  • sp1234
  • (龙芯偷盗8年终于“合理”购买了)
  • 等 级:
  • 结帖率:
楼主发表于:2008-03-20 03:01:52
如果你的数据源不是直接返回OO集合,而是过去常见的弱类型DataSet,那么也可以先把它用Linq管理起来,如下:


public static class ExtMethods
{
    public static IEnumerable <mySimpleType> Cast <MySimpleType>(this DataTable obj)
    {
        List <mySimpleType> ret = new List <mySimpleType>();
        foreach (DataRow row in obj.Rows)
            ret.Add(new mySimpleType() { Name = row["name"], Date = row["date"], Doc = row["doc"] });
        return ret;
    }
}

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


在主程序中,可以这样写查询了:

DataSet abc;
//todo: 设置abc的数据
var search = from r in abc.Tables["SimpleTable"].Cast <mySimpleType>()
            where r.Name.StartsWith("wu") && r.Date >= DateTime.Parse("2008/1/10")
            select r;


Linq起步是不是特别简单呢?!
回复次数:9
  • sp1234用户头像
  • sp1234
  • (龙芯偷盗8年终于“合理”购买了)
  • 等 级:
#1楼 得分:0回复于:2008-03-20 03:08:14
Linq的出现,过去的所谓“强类型DataSet设计方式”就下岗了。其实Linq让很多过去的“技巧”下岗了,程序变为更好的OO味道。
#2楼 得分:0回复于:2008-03-20 03:15:42

很多时候,过去的技巧,还是linq不能代替的
  • sp1234用户头像
  • sp1234
  • (龙芯偷盗8年终于“合理”购买了)
  • 等 级:
#3楼 得分:0回复于:2008-03-20 03:36:40
对于优化Cast <T>,首先想到的当然是(如果有可能)把中间的转换数据缓存起来,在各个查询中复用。不过最本质的办法当然还是去自己开发一个Linq provider,例如上面代码在查询运行时并不需要把DataTable复制到新的对象里(尽管只有在数据大多是值类型时才会显得慢)。程序员会开发那种东西技术上就不错了,会用Linq并不算什么技术。
  • sp1234用户头像
  • sp1234
  • (龙芯偷盗8年终于“合理”购买了)
  • 等 级:
#4楼 得分:0回复于:2008-03-20 03:42:14
最可取的做法是从来不用DataSet,而是直接对DataSet的“来源”提供一个Cast <T>()方法。我见到从来不用DataSet而用对象集合写程序的人,尽管这些人写的OO风格的程序似乎读起来很简单,实际上把技巧(Linq不仅仅带来了Linq语法)都融合在底层了。
#5楼 得分:0回复于:2008-03-20 08:35:54
mark~
  • sp1234用户头像
  • sp1234
  • (龙芯偷盗8年终于“合理”购买了)
  • 等 级:
#6楼 得分:0回复于:2008-03-22 00:21:07
可能应该写:

public static IEnumerable <mySimpleType>  Cast <T> (this DataTable obj) where T: mySimpleType
  • thinkc用户头像
  • thinkc
  • (【淡定】)
  • 等 级:
#7楼 得分:0回复于:2008-03-31 09:24:19
最可取的做法是从来不用DataSet,而是直接对DataSet的“来源”提供一个Cast <T>()方法
----------------------------------------
DataSet的“来源”指的是什么Conection,Command?
#9楼 得分:0回复于:2009-06-05 10:03:58
强贴必留名
相关问题
net三层架构UI层是否不应该出现SQL代码
(《应当重视ORM》的姊妹篇) 谈谈ORM触发器设计—— 特别献给那开发开源 ...
用C#/.NET挑战一下VFP