"PLINQApplicaions":
(рис 13.1)
Server Explorer меню View или с помощью сочетания горячих клавиш "Ctrl + Alt+S"
(рис 13.2)
"Data Connections" и выберите пункт "Add connection…"
(рис 13.3)
"Add Connection". В диалоговом окне необходимо ввести адрес или имя сервера (Sever name), где расположена база данных, тип доступа к базе данных (SQL аутентификация или Windows аутентификация) и выбрать из писка нужную базу данных (в нашем случае база данных Northwind):
(рис 13.4)
Общая схема данных Northwind выглядит следующим образом:
(рис 13.5)
Northwind:
(рис 13.6)
Solution Explorer), для этого щелкните правой кнопкой мыши по названию проекта и выберите пункт "New Item…" или с помощью клавиш "Ctrl+Shift+A":
(рис 13.7)
"Linq to SQL Classes", и введите название добавляемого файла (в нашем случае NorthwindDatabase):
(рис 13.8)
NorthwindDatabase.dbml. Теперь из обозревателя серверов (Server Explorer) перетащите, с помощью мыши, нужные таблицы в окно созданного файла:
(рис 13.9)
Program.cs и создадим в классе Program новый объект класса NorthwindDataBaseDataContext (где NorthwindDataBase - название файла созданного ранее NorthwindDatabase.dbml):
class Program
{
private static NorthwindDataBaseDataContext db = new NorthwindDataBaseDataContext();
….
}
InfoEmployees, со следующими свойствами:
public class InfoEmployees
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string ProductName { get; set; }
public decimal UnitPrice { get; set; }
public int Quantity { get; set; }
public DateTime OrderDate { get; set; }
}
InfoEmployees, с использованием интерфейса IEnumerable и LINQ - запроса к базе данных:
public static IEnumerable<InfoEmployees> GetInfoEmployees()
{
var emp = from em in db.Employees
join o in db.Orders
on em.EmployeeID equals o.EmployeeID
join orderdetails in db.Order_Details
on o.OrderID equals orderdetails.OrderID
join product in db.Products
on orderdetails.ProductID equals product.ProductID
select new InfoEmployees()
{
FirstName = em.FirstName,
LastName = em.LastName,
ProductName = product.ProductName,
UnitPrice=orderdetails.UnitPrice,
Quantity=orderdetails.Quantity,
OrderDate=o.OrderDate.Value
};
return emp;
}
Main() добавим код, который выводит список сотрудников с помощью LINQ-запроса:
static void Main(string[] args)
{
IEnumerable<InfoEmployees> em = GetInfoEmployees();
int count = 1;
var infoemp = from e in em
select e;
foreach (var item in infoemp)
{
Console.WriteLine("{0} {1} {2} {3} {4} {5}", item.FirstName, item.LastName,
item.ProductName, item.Quantity, item.UnitPrice.ToString("C",
CultureInfo.CreateSpecificCulture("en-US")), item.OrderDate.ToString("dd.MM.yyyy"));
count++;
}
Console.WriteLine("--------------------- ");
Console.WriteLine("Количество записей {0}", count);
Console.ReadLine();
}
(рис 13.10)
ProcessItem() для вывода сотрудников на экран, и "заморозим" выполнение данного метода, при каждой итерации, на 10 миллисекунд (Thread.Sleep(10)) для наглядности производительности распараллеленного запроса:
public static string ProcessItem(InfoEmployees item)
{
Thread.Sleep(10);
return string.Format ("{0} {1} {2} {3} {4} {5}", item.FirstName, item.LastName, item.ProductName,
item.Quantity, item.UnitPrice.ToString("C", CultureInfo.CreateSpecificCulture("en-US")),
item.OrderDate.ToString("dd.MM.yyyy"));
}
Main(). В select запросе вызовем метод ProcessItem() и передадим в него объект класса InfoEmployees:
static void Main(string[] args)
{
IEnumerable<InfoEmployees> em = GetInfoEmployees();
int count = 1;
var infoemp = from e in em
select ProcessItem(e);
foreach (var item in infoemp)
{
Console.WriteLine(item);
count++;
}
Console.WriteLine("--------------------- ");
Console.WriteLine("Количество записей {0}", count);
Console.ReadLine();
}
Thread.Sleep()):
(рис 13.11)
Main():
static void Main(string[] args)
{
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
IEnumerable<InfoEmployees> em = GetInfoEmployees();
int count = 1;
var infoemp = from e in em
select ProcessItem(e);
foreach (var item in infoemp)
{
Console.WriteLine(item);
count++;
}
long elapsed = sw.ElapsedMilliseconds;
Console.WriteLine("--------------------- ");
Console.WriteLine("Количество записей {0}", count);
Console.WriteLine("Общее время выполнения запроса {0} мс", elapsed);
Console.ReadLine();
}
Примечание: Для более точно расчета времени выполнения запроса можно использовать sw.ElapsedTicks
(рис 13.12)
Main(), для того что бы распараллелить выполнение метода ProcessItem():
static void Main(string[] args)
{
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
IEnumerable<InfoEmployees> em = GetInfoEmployees();
int count = 1;
var infoemp = from e in em.AsParallel().AsOrdered()
select ProcessItem(e);
foreach (var item in infoemp)
{
Console.WriteLine(item);
count++;
}
long elapsed = sw.ElapsedMilliseconds;
Console.WriteLine("--------------------- ");
Console.WriteLine("Количество записей {0}", count);
Console.WriteLine("Общее время выполнения запроса {0} мс", elapsed);
Console.ReadLine();
}
Примечание: Как видно из примера кода - PLINQ - запрос отличается от LINQ - запроса, только вызовом метода AsParallel() в фрагменте: em.AsParallel().AsOrdered(). Метод AsOrdered() предназначен для упорядочивания записей независимо от наличия упорядоченности по умолчанию. Также можно использовать следующий формат записи LINQ - запроса: var infoemp = em.AsParallel().Select(ProcessItem).AsOrdered();
(рис 13.13)
Листинг кода программы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Globalization;
namespace PLINQApplications
{
class Program
{
private static NorthwindDataBaseDataContext db = new NorthwindDataBaseDataContext();
public class InfoEmployees
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string ProductName { get; set; }
public decimal UnitPrice { get; set; }
public int Quantity { get; set; }
public DateTime OrderDate { get; set; }
}
public static IEnumerable<InfoEmployees> GetInfoEmployees()
{
var emp = from em in db.Employees
join o in db.Orders
on em.EmployeeID equals o.EmployeeID
join orderdetails in db.Order_Details
on o.OrderID equals orderdetails.OrderID
join product in db.Products
on orderdetails.ProductID equals product.ProductID
select new InfoEmployees()
{
FirstName = em.FirstName,
LastName = em.LastName,
ProductName = product.ProductName,
UnitPrice=orderdetails.UnitPrice,
Quantity=orderdetails.Quantity,
OrderDate=o.OrderDate.Value
};
return emp;
}
public static string ProcessItem(InfoEmployees item)
{
Thread.Sleep(10);
return string.Format ("{0} {1} {2} {3} {4} {5}", item.FirstName, item.LastName, item.ProductName,
item.Quantity, item.UnitPrice.ToString("C", CultureInfo.CreateSpecificCulture("en-US")),
item.OrderDate.ToString("dd.MM.yyyy"));
}
static void Main(string[] args)
{
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
IEnumerable<InfoEmployees> em = GetInfoEmployees();
);
int count = 1;
var infoemp = em.AsParallel().Select(ProcessItem).AsOrdered();
foreach (var item in infoemp)
{
Console.WriteLine(item);
count++;
}
long elapsed = sw.ElapsedMilliseconds;
Console.WriteLine("--------------------- ");
Console.WriteLine("Количество записей {0}", count);
Console.WriteLine("Общее время выполнения запроса {0} мс", elapsed);
Console.ReadLine();
}
}
}Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.