Майкрософот предоставило новое легкое в освоении и очень мощное и гибко расширение языков .NET для обработки данных под названием Linq.
Как в многоуровневых приложениях спроектировать провайдер данных так, что бы получить набор объектов?
К примеру , есть таблица tbCustomers ((Int64)CustID, (String)Name, (int32)Age) и есть класс Customers:
publicclass Customers
{
private Int64 _CustID;
public Int64 CustID
{
get { return _CustID; }
set { _CustID = value; }
}
private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
//Тип Int32 допускающее значение null
private Int32? _Age;
public Int32?Age
{
get { return _Age; }
set { _Age = value; }
}
//Инициализаторы
public Customers()
{
}
public Customers(Int64 CustID, string Name, Int32? Age)
{
_CustID = CustID;
_Name = Name;
_Age = Age;
}
//Получение набора объектов из поставщика данных
publicstatic List<Customers> GetCustomers()
{
return CustomersData.GetAllCustomers();
}
}
и необходимо получить из поставщика набор объектов Customers.
Стандартное решение этого вопроса в .NET2.0 является использование пространства имен System.Data.SqlClient:
publicstatic class CustomersData
{
//ИспользованиеSqlClient
public static List<Customers> GetAllCustomers()
{
List<Customers> lst = new List<Customers>();
using (SqlConnection conn = new SqlConnection(«Data Source=…»))
{
conn.Open();
SqlCommand cmd = new SqlCommand(«SELECT CustID, Name, Age FROM tbCustomers», conn);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
lst.Add(new Customers((Int64)reader[«CustID»], (String)reader[«Name»], (Int32)?reader[«Age»]));
}
}
return lst;
}
}
При использовании Linqмы можем получить набор данных из анонимных типов используя инициализатор объекта, т.е.
publicstatic class CustomersData
{
//ИспользованиеLinq
public static List<Customers> GetAllCustomers()
{
LinqDcDataContext db=new LinqDcDataContext();
IEnumerable<Customers> result = db.tbCustomers.Select(c => new Customers(c.CustID, c.Name, c.Age));
//ПриводимнаборIEnumerable<Customers> кList<Customers>
return new List<Customers>(result);
}
}
Оригинал статьи Linq в n-уровневой архитектуре
Как в многоуровневых приложениях спроектировать провайдер данных так, что бы получить набор объектов?
К примеру , есть таблица tbCustomers ((Int64)CustID, (String)Name, (int32)Age) и есть класс Customers:
publicclass Customers
{
private Int64 _CustID;
public Int64 CustID
{
get { return _CustID; }
set { _CustID = value; }
}
private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
//Тип Int32 допускающее значение null
private Int32? _Age;
public Int32?Age
{
get { return _Age; }
set { _Age = value; }
}
//Инициализаторы
public Customers()
{
}
public Customers(Int64 CustID, string Name, Int32? Age)
{
_CustID = CustID;
_Name = Name;
_Age = Age;
}
//Получение набора объектов из поставщика данных
publicstatic List<Customers> GetCustomers()
{
return CustomersData.GetAllCustomers();
}
}
и необходимо получить из поставщика набор объектов Customers.
Стандартное решение этого вопроса в .NET2.0 является использование пространства имен System.Data.SqlClient:
publicstatic class CustomersData
{
//ИспользованиеSqlClient
public static List<Customers> GetAllCustomers()
{
List<Customers> lst = new List<Customers>();
using (SqlConnection conn = new SqlConnection(«Data Source=…»))
{
conn.Open();
SqlCommand cmd = new SqlCommand(«SELECT CustID, Name, Age FROM tbCustomers», conn);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
lst.Add(new Customers((Int64)reader[«CustID»], (String)reader[«Name»], (Int32)?reader[«Age»]));
}
}
return lst;
}
}
При использовании Linqмы можем получить набор данных из анонимных типов используя инициализатор объекта, т.е.
publicstatic class CustomersData
{
//ИспользованиеLinq
public static List<Customers> GetAllCustomers()
{
LinqDcDataContext db=new LinqDcDataContext();
IEnumerable<Customers> result = db.tbCustomers.Select(c => new Customers(c.CustID, c.Name, c.Age));
//ПриводимнаборIEnumerable<Customers> кList<Customers>
return new List<Customers>(result);
}
}
Оригинал статьи Linq в n-уровневой архитектуре