Здравствуйте, trickyKid, Вы писали:
K>Ну прям таки замена DataSet... Я что могу достать несколько связанных таблиц одним запросом?
Да, а в чем проблема? Он на то и LINQ.
VD>Приемущество именно Линка как раз и заключается в том, что запросы сливаются с основным языком. Производится сквозной контроль типов. Мы уже не может мполучить ошибку связанную с типом во время выполнения.
Хотелось бы добавить...
На самом деле вот какая штука не очень хорошая имеет место быть. Компилятором LINQ-выражение будет признано верным с точки зрения системы типов CLR.
Но для того механизма, который будет выполнять этот запрос в конечном итоге, правила корректности могут несколько отличаться.
Например, какой-нибудь Linq2Xxx может не поддерживать оператор is или например оператор ??. Ну и в конце концов, в Linq-выражениях могут использоваться какие-то произвольные внешние статические методы, незнакомые генератору SQL.
Соответственно, ТАКИЕ ошибки выявляются только на этапе выполнения и никакой помощи во время разработки не приходится ждять ни от IntelliSense, ни от компилятора, ни от кого-то еще
K> Тут, кстати, вижу плюс использования обычного SQL в том, что чтобы проверить работает ли запрос, мне не надо проект собирать весь.
Данный "плюс использования обычного SQL" нивелируется наличием в VS2008TS такой фичи как панелька "Object Test Bench" (хотя может она и в Pro) есть. Тем кто не знает — это панелька, кот. позволяет создать объект произовольного типа с указанием параметров конструктора и вызвать его метод — подебажить...
Я, правда, должен признаться не смог её запустить (может подскажете как? — не могу в неё класс закинуть для конструирования).
K>>Ну прям таки замена DataSet... Я что могу достать несколько связанных таблиц одним запросом? H>Да, а в чем проблема? Он на то и LINQ.
А можно простенький примерчик для ньюьбов? Допустим для того же примера: получить список кастомеров и для каждого OrderList покупок.
Я связь своего кода с базой ранее делал через BLToolKit, хотелось бы попробовать новое решение, но пока нет книги толковой под рукой, а вот интересно.
Здравствуйте, _Budda_, Вы писали:
K>>>Ну прям таки замена DataSet... Я что могу достать несколько связанных таблиц одним запросом? H>>Да, а в чем проблема? Он на то и LINQ. _B_>А можно простенький примерчик для ньюьбов? Допустим для того же примера: получить список кастомеров и для каждого OrderList покупок.
Сам полный ньюб, первый раз писал. Вот что получилось:
static void Main(string[] args)
{
NorthwindDataContext db = new NorthwindDataContext();
var customers = from c in db.Customers select c;
foreach (var cust in customers)
{
Console.WriteLine("Customer {0} ID = {1}", cust.ContactName, cust.CustomerID);
foreach (var order in cust.Orders)
{
Console.WriteLine(" Order Date = {0}", order.OrderDate);
foreach (var orderDetail in order.Order_Details)
{
Console.WriteLine(" Product {0} Quantity = {1}", orderDetail.Product.ProductName, orderDetail.Quantity);
}
}
Console.WriteLine();
}
Console.ReadKey();
}
Класс NorthwindDataContext сгенерил с помощью студии, тупо перетащив в дизайнер все таблицы из базы. БД — Northwind от Microsoft.
Здравствуйте, _Budda_, Вы писали:
_B_>Данный "плюс использования обычного SQL" нивелируется наличием в VS2008TS такой фичи как панелька "Object Test Bench" (хотя может она и в Pro) есть. Тем кто не знает — это панелька, кот. позволяет создать объект произовольного типа с указанием параметров конструктора и вызвать его метод — подебажить... _B_>Я, правда, должен признаться не смог её запустить (может подскажете как? — не могу в неё класс закинуть для конструирования).
Открываешь окошко Class View, там правой кнопкой на нужном классе и выбираешь Create Instance и выбираешь конструктор
Простите, где-то видел, но не помню где. Эта база, Northwind — это вроде какая-то стандартная, кот. поставляется вместе c MSSQL? Т.е. надо поставить последнее, дабы получить первое?
G>
G> static void Main(string[] args)
G> {
G> NorthwindDataContext db = new NorthwindDataContext();
G> var customers = from c in db.Customers select c;
G> foreach (var cust in customers)
G> {
G> Console.WriteLine("Customer {0} ID = {1}", cust.ContactName, cust.CustomerID);
G> foreach (var order in cust.Orders)
G> {
G> Console.WriteLine(" Order Date = {0}", order.OrderDate);
G> foreach (var orderDetail in order.Order_Details)
G> {
G> Console.WriteLine(" Product {0} Quantity = {1}", orderDetail.Product.ProductName, orderDetail.Quantity);
G> }
G> }
G> Console.WriteLine();
G> }
G> Console.ReadKey();
G> }
G>
G>Класс NorthwindDataContext сгенерил с помощью студии, тупо перетащив в дизайнер все таблицы из базы. БД — Northwind от Microsoft.
кхэх... и это всё? Т.е. всё, что надо сделать это:
var customers = from c in db.Customers select c;
?
ммм. появилось вопросов больше, чем было (что впринципе логично, при вхождении в новую область).
1. Но насколько я понимаю, в этом случае из базы выгребается ВСЁ, что связано с таблицей Customers?
2. или же необходимые данные выбираются по мере обращения к членам объекта customers?
_B_>>Я, правда, должен признаться не смог её запустить (может подскажете как? — не могу в неё класс закинуть для конструирования).
_>Открываешь окошко Class View, там правой кнопкой на нужном классе и выбираешь Create Instance и выбираешь конструктор
ну да, это я читал. Но когда я делаю "правой кнопкой на нужном классе", то в контекстном меню нет пункта "Create Instance"...?
Клас — примитивнейший.
public class C1
{
public C1(int a)
{ A=a; }
public int A { get; set; }
}
Здравствуйте, _Budda_, Вы писали:
_B_>Простите, где-то видел, но не помню где. Эта база, Northwind — это вроде какая-то стандартная, кот. поставляется вместе c MSSQL? Т.е. надо поставить последнее, дабы получить первое?
G>>
G>> static void Main(string[] args)
G>> {
G>> NorthwindDataContext db = new NorthwindDataContext();
G>> var customers = from c in db.Customers select c;
G>> foreach (var cust in customers)
G>> {
G>> Console.WriteLine("Customer {0} ID = {1}", cust.ContactName, cust.CustomerID);
G>> foreach (var order in cust.Orders)
G>> {
G>> Console.WriteLine(" Order Date = {0}", order.OrderDate);
G>> foreach (var orderDetail in order.Order_Details)
G>> {
G>> Console.WriteLine(" Product {0} Quantity = {1}", orderDetail.Product.ProductName, orderDetail.Quantity);
G>> }
G>> }
G>> Console.WriteLine();
G>> }
G>> Console.ReadKey();
G>> }
G>>
G>>Класс NorthwindDataContext сгенерил с помощью студии, тупо перетащив в дизайнер все таблицы из базы. БД — Northwind от Microsoft. _B_>кхэх... и это всё? Т.е. всё, что надо сделать это: _B_>
_B_>var customers = from c in db.Customers select c;
_B_>
_B_>?
Ну как видишь.
_B_>ммм. появилось вопросов больше, чем было (что впринципе логично, при вхождении в новую область). _B_>1. Но насколько я понимаю, в этом случае из базы выгребается ВСЁ, что связано с таблицей Customers? _B_>2. или же необходимые данные выбираются по мере обращения к членам объекта customers?
Профайлер показал что на каждый foreach по одному запросу. То есть кастомеры считываются один раз, orders выбирается столько раз, сколько кастомеров, с фильтром по ключу естественно, итд
G>Профайлер показал что на каждый foreach по одному запросу. То есть кастомеры считываются один раз, orders выбирается столько раз, сколько кастомеров, с фильтром по ключу естественно, итд
Т.о. код
var customers = from c in db.Customers select c;
выполняет создание контейнера и выбирает его записи из таблицы Customers. При обращении к его заказам
foreach (var order in cust.Orders)
в момент cust.Orders выполняется аналогичная операция уже для заказов. Но вопрос: кто выполняет новый поход в БД? ЛинКью? Или член Orders класса Customers? ИМХО последнее. Но он опять же юзает ЛинКью:
как-то так
var _orders = from o in db.Orders select o;
Подумаю вслух:
Если раньше для подобной операции мне надо было сделать:
public abstract class ACustomers{
// описать привязку полям к членам
}
List<ACustomers> customers ;
using (DbManager db = new DbManager())
{
customers = db
.SetCommand("SELECT Id, Name, ... FROM customers")// или SetSpCommand("GetCustomers")
.ExecuteList<ACustomers>()
;
}
То теперь... создавать класс для меня будет студия, а формировать и выполнять запрос ЛинКью.
Не могу понять только нюанс создания классов: ЧТО ИМЕННО выполняет эту функцию. То что это делает студия понятно, но какая её часть?
Linq2SQL это не язык запросов к БД, это набор классов, методов расширения и атрибутов, которые позволяют с помощью языка запросов Linq обращаться к БД.
Фактически всю работу по загрузке связанных таблиц выполняет класс EntitySet.
прочтите раздел MSDN про linq, там не очень много, если английского совсем не знаете, то хотя бы посмотрите картинки и повыполняйте приводимые примеры
посмотрите, что в отладчике происходит с вашим запросом
не додумывайте технологии, а просто изучайте
B>>То теперь... создавать класс для меня будет студия, а формировать и выполнять запрос ЛинКью. G>Linq2SQL это не язык запросов к БД, это набор классов, методов расширения и атрибутов, которые позволяют с помощью языка запросов Linq обращаться к БД.
Это я понимаю G>Фактически всю работу по загрузке связанных таблиц выполняет класс EntitySet.
А EntitySet — класс из System.Linq, верно?
Собственно не вопрос, какой именно класс загружает данные. Главное, что кто-то из System.LinQ.
Сумбур (для меня) внесло использование генерируемых студией классов... я просто не знаю их внутренностей... потому и возникают вопросы...
Мне просто чтобы посмотреть надо поставить MS SQL... потому задаю вопросы человеку, которому на них интересно отвечать... А>не додумывайте технологии, а просто изучайте
А что мы додумываем? Что в примере gandjustas'а додуманного?
Здравствуйте, _Budda_, Вы писали:
G>>Фактически всю работу по загрузке связанных таблиц выполняет класс EntitySet. _B_>А EntitySet — класс из System.Linq, верно?
System.Data.Linq
Linq2Sql это сборка System.Data.Linq.dll
_B_>Собственно не вопрос, какой именно класс загружает данные. Главное, что кто-то из System.LinQ. _B_>Сумбур (для меня) внесло использование генерируемых студией классов... я просто не знаю их внутренностей... потому и возникают вопросы...
А посмотреть?
_B_>>Собственно не вопрос, какой именно класс загружает данные. Главное, что кто-то из System.LinQ. _B_>>Сумбур (для меня) внесло использование генерируемых студией классов... я просто не знаю их внутренностей... потому и возникают вопросы... G>А посмотреть?
Обязательно посмотрю. Но щас нет под рукой установленной MSSQL с базой, чтобы посмотреть
Здравствуйте, _Budda_, Вы писали:
_B_>ну да, это я читал. Но когда я делаю "правой кнопкой на нужном классе", то в контекстном меню нет пункта "Create Instance"...?
Редакция VS2008 какая? Оно доступно только в Team-редакциях.
Здравствуйте, denisio_mcp, Вы писали:
_>Здравствуйте, _Budda_, Вы писали:
_B_>>ну да, это я читал. Но когда я делаю "правой кнопкой на нужном классе", то в контекстном меню нет пункта "Create Instance"...?
_>Редакция VS2008 какая? Оно доступно только в Team-редакциях.
TS редакция, тим юниты есть... Вид TestBench есть, в нём написано то же, что ты мне советовал выше... но добавить туда чего-то не получается
_>Редакция VS2008 какая? Оно доступно только в Team-редакциях.
Полез в "About" а там куча всего... может и нет того, что нужно для Test Bench. Посмотри, плиз.
Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5
Installed Edition: Enterprise
Microsoft Visual Basic 2008 хххх-ххх-ххххххх-ххххх
Microsoft Visual Basic 2008
Microsoft Visual C# 2008 хххх-ххх-ххххххх-ххххх
Microsoft Visual C# 2008
Microsoft Visual C++ 2008 хххх-ххх-ххххххх-ххххх
Microsoft Visual C++ 2008
Microsoft Visual Studio 2008 Tools for Office хххх-ххх-ххххххх-ххххх
Microsoft Visual Studio 2008 Tools for Office
Microsoft Visual Studio Team System 2008 Architecture Edition хххх-ххх-ххххххх-ххххх
Microsoft Visual Studio Team System 2008 Architecture Edition
Microsoft Visual Studio Team System 2008 Database Edition хххх-ххх-ххххххх-ххххх
Microsoft Visual Studio Team System 2008 Database Edition
Microsoft Visual Studio Team System 2008 Development Edition хххх-ххх-ххххххх-ххххх
Microsoft Visual Studio Team System 2008 Development Edition
Здравствуйте, _Budda_, Вы писали:
_>>Редакция VS2008 какая? Оно доступно только в Team-редакциях. _B_>Полез в "About" а там куча всего... может и нет того, что нужно для Test Bench. Посмотри, плиз.