65.9K
CodeProject 正在变化。 阅读更多。
Home

将简单 .NET 类迁移到 LINQ 类的策略

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.14/5 (6投票s)

2009年7月26日

CPOL

3分钟阅读

viewsIcon

33586

downloadIcon

142

如何将简单 .NET 类迁移到 LINQ 类。

引言

引言和目标

当引入新技术时,最大的业务挑战之一是以最小的努力将当前项目迁移到新技术。我确信从商业投资的角度来看,从头开始开发并非总是首选方案。 LINQ 是最常被谈论的新技术之一。本文将重点介绍如何将现有的 .NET 类转换为支持 LINQ 的类。

LINQ 是一种统一的编程语言,它基本上将旧的 .NET 类提升到一个更高的水平。它通过使用 LINQ 查询降低了业务类的复杂性。在本文中,我们将讨论如何利用和迁移我们的旧 .NET 类,使其支持 LINQ。 LINQ 具有比我刚才所说的更多的优势;如果您不了解基本知识,您可以在此处阅读相关内容:LINQNewbie.aspx

这是我送给我所有 .NET 朋友的小礼物,一本完整的 400 页常见问题解答电子书,涵盖各种 .NET 技术,如 Azure、WCF、WWF、Silverlight、WPF、SharePoint 等等:http://www.questpond.com/SampleDotNetInterviewQuestionBook.zip

免责声明:请不要喷我……

我在这里得出的结论是基于一个已迁移的项目。该项目只有 15 个类,并且编写良好。我真的不确定这对于拥有大量类的项目是否有效。我将继续进行这个迁移项目 6 个月,所以我在本文中会更新我面临的任何挑战或问题。

所以在您开始实施之前,请做好家庭作业。

简单的 .NET 类

这是一个简单的 .NET 客户类,它具有三个属性:IdCustomerNameCustomercode。我们将研究如何在不触及核心逻辑的情况下将此 .NET 类迁移到 LINQ 类。

public class clsCustomer
{
    private int _intCustomerId;
    private string _strCustomerName;
    private string _strCustomerCode;

    public int CustomerId
    {
        set
        {
            _intCustomerId = value;
        }
        get
        {
            return _intCustomerId;
        }
    }
    public string CustomerName
    {
        set
        {
            _strCustomerName = value;
        }
        get
        {
            return _strCustomerName;
        }
    }
    public string CustomerCode
    {
        set
        {
            _strCustomerCode = value;
        }
        get
        {
            return _strCustomerCode;
        }
    }
}

该方法的核心:XML 映射

LINQ 提供了基于属性的 XML 映射。因此,您可以拥有纯 .NET 类,并且可以在 XML 文件中定义 LINQ 映射。然后,LINQ 引擎可以从 XML 文件读取映射并将其应用于您的简单 .NET 类。

XML 文件

下面是我的 XML 文件,我在其中定义了表列与类属性、数据库名称、表名和类类型的映射。

<?xml version="1.0" encoding="utf-8"?>
<Database Name="TstServer" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007">
<Table Name="dbo.Customer" Member="WebAppMappingXML.clsCustomer">
<Type Name="WebAppMappingXML.clsCustomer">
<Column Name="CustomerId" Member="CustomerId" />
<Column Name="CustomerName" Member="CustomerName" />
<Column Name="CustomerCode" Member="CustomerCode" />
</Type>
</Table>
</Database>

要将 XML 映射与简单的 .NET 类绑定,我们首先需要创建 XMLMappingSource 对象,如下面的代码片段所示。

XmlMappingSource xms = XmlMappingSource.FromUrl(physicalPath + "Mapping.xml");

我们需要将 XMLMappingSource 对象传递给 DataContext 类,如下面的代码片段所示

DataContext objContext = new DataContext(strConn, xms);

最后,我们可以获取表并循环遍历实体对象

var query = from customer in objContext.GetTable<clsCustomer>()
select customer;

foreach (var item in query)
{
    Response.Write(item.CustomerCode + "<br>");
}

应用存储过程

如果您在项目中使用了存储过程,您可以使用 Function XML 元素在 XML 文件中定义您的存储过程名称。客户端代码对于绑定 DataContextXMLMappingsource 对象没有任何改变。

<?xml version="1.0" encoding="utf-8"?>
<Database Name="TstServer" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007">
<Table Name="dbo.Customer" Member="WebAppMappingXML.clsCustomer">
<Type Name="WebAppMappingXML.clsCustomer">
<Column Name="CustomerId" Member="CustomerId" />
<Column Name="CustomerName" Member="CustomerName" />
<Column Name="CustomerCode" Member="CustomerCode" />
</Type>
</Table>
<Function Name="dbo.sp_getCustomerCode" Method="getCustomerByCode">
<Parameter Name="CustomerCode" Parameter="" />
<ElementType Name="clsCustomer" />
</Function>
</Database>

该方法的优点和缺点

首先让我们从所有的好处开始。

  • 您不需要更改您的核心 .NET 类。您的核心 .NET 类和 LINQ 引擎之间存在完全的 XML 隔离。
  • 您可以利用 LINQ 查询并最大限度地降低业务对象逻辑的复杂性。
  • 您的数据库类完全被删除,并被 LINQ 数据上下文取代。这最大限度地减少了 DAL 类中的大量编码。

坏处

  • 有时,这种迁移所花费的精力可能比从头开始构建更多。
  • 您需要手动编写复杂的 XML 文件。我们没有尝试 SQLMETAL 或其他工具。也许你们可以尝试一下来消除这个缺点。
  • 具有关系的类需要由 EntitySetEntityRef 替换。这有点棘手,并且可能会更改您的集合接口。

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.