ADO.NET 3.0. Impedance Mismatch и все остально

6yrop

Microsoft делает еще одну попытку сделать доступ к реляционным данным из дотнета удобной (первая ObjectSpace к счастью провалилась). Вот несколько статей по этой теме
http://blogs.gotdotnet.ru/personal/mihailik/PermaLink.aspx?g...
То что предлагаемое решение "в стиле IBM-Java-CORBA-EJB" , несколько удручает.
Вот в этой статье
http://msdn.microsoft.com/data/default.aspx?pull=/library/en...
о Impedance Mismatch. Неужели нельзя было просто встроить SQL в C#? Пример из статьи выглядел бы вот так

static void GetNewOrders(DateTime date, int qty) {
using (NorthWindDB nw = new NorthWindDB {

var orders =
SELECT
Orders.OrdersId,
Orders.OrderDate,
d.Total
FROM
Orders
NATURAL JOIN
(SELECT OrderID, SUM(Quantity) as Total
FROM OrderDetails
GROUP BY OrderID
HAVING Total >= qty) d
WHERE
Orders.OrderDate >= date;

foreach (SalesOrder o in orders) {
Console.WriteLine("{0:d}\t{1}\t{2}",
o.OrderDate, o.OrderId, o.Total);

}
}

Helga87

Вообще, в C# 3.0 можно будет делать вот так:
 
var q =
from c in db.Customers
join o in db.Orders on c.CustomerID equals o.CustomerID
where c.City == "London"
select o;

См The LINQ Project
update. Хм, оказывается, все это и будет работать вместе с Linq (там снизу Михалик об этом говорит)

6yrop

Кстати, все три варианта запроса в статье написаны с ОШИБКАМИ:
1.

SELECT o.OrderDate, o.OrderID, SUM(d.Quantity) as Total
FROM Orders AS o
LEFT JOIN [Order Details] AS d ON o.OrderID = d.OrderID
WHERE o.OrderDate >= @date
GROUP BY o.OrderID
HAVING Total >= 1000"

в SELECT нельзя писать o.OrderDate поскольку он не упоминается в GROUP BY. Зачем LEFT JOIN если все равно стоит условие HAVING Total >= 1000", можно было написать INNER JOIN.
2.

var orders = from o in nw.Orders
where o.OrderDate > date
select new { o.orderID,
o.OrderDate, Total = o.OrderLines.Sum(l => l.Quantity);

Скобка "select new {" нигде не закрывается. Где условие, из которого потом получается Total >= 1000? (в следующем запросе оно почему-то присутствует)
3.

SELECT o.OrderDate, o.OrderId, o.Total
FROM (SELECT o.OrderId,
SUM(o.OrderDetails..Quantity) AS Total,
FROM Orders AS o
WHERE o.OrderDate >= @date) AS o
WHERE o.Total >= 1000

Откуда-то взялось OrderDetails во фроме оно отсутствует... И вообще какой-то бред написан.
Если разработчики новой технологии не могут без ошибок элементарный запрос написать, что же они такое налобают...

6yrop

я к тому что не надо придумывать новый язык

6yrop

update. Хм, оказывается, все это и будет работать вместе с Linq (там снизу Михалик об этом говорит)
это я все понял

6yrop

скорее всего причина, по которой не хотят встраивать SQL в C# — поддержка разных СУБД, т.е. не хотят жестко завязываться на MSSQLServer.

6yrop

Вообще, судя по всему .NET не собирается становится серьезной платформой для разработки бизнес-приложений, т.е. не собирается конкурировать с системами разработки ERP-систем Axapta, R3, OEBS, 1C. Видимо она пока так и остается ориентированной на мелкие задачи интеграции и web. Это видно по ADO, а так же по WCF(Indigo которое строится на Weв services-ах, а Remouting вообще задвигают. Но ведь для разработки Remouting удобнее, его минус только в отсутствии кросплатформенности.

Helga87

Ты кстати WCF уже начал ботать?

6yrop

нет , только обзорную статью прочитал

Helga87

я вот тоже пока еще нет, все собираюсь

laki

сейчас есть разработка мелкомягких Linq или как-то так там уже так можно делать.
плохо что под оракл нет аналога

Helga87

Есть слухи, что они хотят сделать поддержку и для DB2, и для Oracle

6yrop

или как-то так там уже так можно делать.
это же в стадии разработки, там еще десять раз все поменяется, я бы не стал это использовать

laki

вроде слухи о том что они все это дело откроют, и для оракла будет писать тот кому это надо

ava3443

вот интересно, как при встраивании SQL в язык поступать с хинтами?

Helga87

Думаю, будет простое решение: в сложных случаях запрос будет выполняться по классической схеме.

6yrop

если встраивать SQL, то хинты останутся на своем месте

6yrop

 
This paper focuses on programming against data and how by raising the level of abstraction from the logical (relational) level to the conceptual (entity) level we can eliminate the impedance mismatch for both applications and data services like reporting, analysis, and replication offered as part of the SQL Server product.
http://msdn.microsoft.com/data/default.aspx?pull=/library/en...
 

майкрософт решила строить систему не на основе логики (logical level а по понятиям (conceptual level)
Оставить комментарий
Имя или ник:
Комментарий: