• LINQ to XML CRUD,并且封装为DAL方法


    转自于: http://www.wyjexplorer.cn/Blog/View/EC3073A1BDFB9D90.html

    CRUD是指在做计算处理时的 增加(Create)查询(Retrieve)(重新得到数据)更新(Update)删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中数据库或者持久层的基本操作功能。

    LINQ非常牛逼,操作数据库和集合对象非常方便,已经得到了非常广泛的应用。好处我不多说了。今天来给大家看看LINQ对XML的增删改查操作,并且封装为DAL类,方便在多层结构的应用程序中使用。以我网站的友情链接模块为例:

    XML文件的结构如下:


    <!--?xml version="1.0" encoding="utf-8"?--> <friendlinkdata> <friendlink> <id>1</id> <title>XNA Develop</title> <url>http://www.xnadevelop.com/</url> <orderid>1</orderid> </friendlink> <friendlink> <id>2</id> <title>BlogNT 开源.NET博客</title> <url>http://www.blognt.com/</url> <orderid>2</orderid> </friendlink> </friendlinkdata>
     
    和以往写ORM一样,我们首先要把对数据的描述抽象为model:
     

    public
    sealed class FriendLink { private int _id; private string _title; private string _url; private int _orderId; public int Id { get { return _id; } set { _id = value; } } public string Title { get { return _title; } set { _title = value; } } public string Url { get { return _url; } set { _url = value; } } public int OrderId { get { return _orderId; } set { _orderId = value; } } }
     

    接下来我们就可以用LINQ 写DAL了。

    注意先要using这些命名空间:


    using
    System.Linq;
    using System.Xml;
    using System.Xml.Linq;

    下面代码中的_xmlPath局部变量是你XML文件的虚拟路径。

    Add(新增一条记录):


    public
    bool Add(GeekStudio.ORM.Model.FriendLink model) { try { int id = GetNextId(); string path = HttpContext.Current.Server.MapPath(_xmlPath); XDocument xDoc = XDocument.Load(path); xDoc.Element(rootName).Add( new XElement("FriendLink", new XElement("Id", id), new XElement("Title", model.Title), new XElement("Url", model.Url), new XElement("OrderId", model.OrderId) )); xDoc.Save(path); return true; } catch { return false; } }
     
    GetModel(查询:根据Id获取一条记录(一个Model))
     
    public GeekStudio.ORM.Model.FriendLink GetModel(int Id)
    {
        string path = HttpContext.Current.Server.MapPath(_xmlPath);
        XDocument xDoc = XDocument.Load(path);
        var q = from fdlink in xDoc.Descendants("FriendLink")
                where fdlink.Element("Id").Value == Id.ToString()
                select new ORM.Model.FriendLink()
                {
                    Id = Convert.ToInt32(fdlink.Element("Id").Value),
                    Title = fdlink.Element("Title").Value,
                    Url = fdlink.Element("Url").Value,
                    OrderId = Convert.ToInt32(fdlink.Element("OrderId").Value)
                };
        return q.ToList()[0];
    }
    
     

    如果要返回一个Model集合,只需对查询结果q中的每一项Add到一个List中,然后返回这个List就行了。

    Delete(删除一条记录)


    public
    bool Delete(int Id) { try { string path = HttpContext.Current.Server.MapPath(_xmlPath); XDocument xDoc = XDocument.Load(path); (from fdlink in xDoc.Descendants("FriendLink") where fdlink.Element("Id").Value == Id.ToString() select fdlink).Remove(); xDoc.Save(path); return true; } catch { return false; } }
     
    Update(更新一条记录)

    public
    bool Update(GeekStudio.ORM.Model.FriendLink model) { try { string path = HttpContext.Current.Server.MapPath(_xmlPath); XDocument xDoc = XDocument.Load(path); var q = from fdlink in xDoc.Descendants("FriendLink") where fdlink.Element("Id").Value == model.Id.ToString() select fdlink; foreach (XElement xe in q) { xe.SetElementValue("Title", model.Title); xe.SetElementValue("Url", model.Url); xe.SetElementValue("OrderId", model.OrderId); } xDoc.Save(path); return true; } catch { return false; } }
     

    至此,我们已经写好了CRUD的4个方法。大家可以根据自己需要做调整。

    附:一个错误的方法:生成下一个Id的方法(寻找最大的Id然后+1)


    private
    static int GetNextId() { string path = HttpContext.Current.Server.MapPath(_xmlPath); try { XDocument xDoc = XDocument.Load(path); var q = (from fdlink in xDoc.Descendants("FriendLink") select fdlink.Element("Id").Value).Max(); int i = int.Parse(q); return i + 1; } catch { return 0; } }

    提示:这个方法是有bug的。文末公布bug。

    不过XML做数据库还是无法和传统的关系型数据库做比较,毕竟思想不一样。比如这个方法。我们知道,通过最大ID+1生成的新Id是可笑的。我们的 本意是Id为IDENTITY列。但如果让数据库做,这个Id就不会是最大Id+1了。比如你有一坨记录,Id为1,2,3,4。你把4删了,再增加一条 记录,数据库绝对不会把新记录的Id写成4。而是从5开始的。

    另外,XML也有很多硬伤,无法和数据库相比。本文只是演示如何用LINQ对XML进行增删改查操作,并不是建议大家用XML做数据库。至于用什么来存数据,这是一个“适合和不适合”的命题,而不是一个“对与错”的命题~。

    刚才提到的bug其实是这样的:

    select Convert.ToInt32(fdlink.Element("Id").Value)).Max();
    恍然大悟吧?:D 
  • 相关阅读:
    学习总结------用JDBC连接MySQL
    MySQL基础语法------增删改查
    2、一、Introduction(入门):1、Application Fundamentals(应用程序基础)
    1、一、Introduction(入门): 0、Introduction to Android(引进到Android)
    小算法:合并两个有序数组,合并之后仍然有序
    小算法:求一个数的乘方
    标准SQL资料整理
    Android 4.0以上BlurMaskFilter效果无效
    Android反编译工具介绍与简单实用方法
    数据结构和算法笔记1 算法的定义,特性,设计要求
  • 原文地址:https://www.cnblogs.com/iceicebaby/p/2426736.html
Copyright © 2020-2023  润新知