Часто задаваемые вопросы о LINQ: третья часть - Как с помощью файлов XML увязать атрибуты LINQ с простыми классами .NET?

ОГЛАВЛЕНИЕ

Как с помощью файлов XML увязать атрибуты LINQ с простыми классами .NET?

LINQ обеспечивает увязку XML на базе атрибутов. Можно определить увязку LINQ с чистым классом .NET в файле XML, как показано ниже для класса clsCustomer. Механизм LINQ читает увязку из файла XML и применяет ее к простым классам .NET.

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, определяющий увязку с членами класса.

<?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>");
}

Как с помощью файлов XML увязать хранимые процедуры с классами .NET?

Если в проекте есть хранимые процедуры, можно использовать элемент XML Function для определения имени хранимой процедуры в файле XML. Не меняется код клиента для привязки объектов DataContext и XMLMappingsource.

<?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>