Inline Select с помощью LINQ - PullRequest
       23

Inline Select с помощью LINQ

1 голос
/ 15 декабря 2009

Мне нужно реплицировать оператор T-SQL с внутренним выбором, используя LINQ:

SELECT *, 
CustomerTypes.Description as CustomerType, 
(Select Min(Distinct DocumentStatistics.StatDateTime) As LastStatCheck
From DocumentStatistics
Where DocumentStatistics.CustomerId = Customers.CustomerId) As LastStatCheck 
FROM Customers 
INNER JOIN CustomerTypes ON Customers.CustomerTypeID = CustomerTypes.CustomerTypeID 
ORDER BY CustomerName

Следующее является самым близким, к которому я смог прийти, но в итоге возвращается вся DocumentStatistics, более 40 000.

            Dim docQuery = (From doc In data.DocumentStatistics _
                       Select doc)

        Dim query = From customer In data.Customers _
                    Join docStat In docQuery _
                    On customer.CustomerID Equals docStat.CustomerID _
                    Select Customer = customer, LastStatCheck = _
                        (From doc In docQuery Where customer.CustomerID = doc.CustomerID _
                        Select doc.StatDateTime).Distinct().Min()

Чего мне не хватает? Как мне скопировать исходный оператор SQL?

Я могу взять примеры VB или C #, и я работаю с базой данных SQL Server.

Ответы [ 4 ]

3 голосов
/ 15 декабря 2009

Для этого вам нужно использовать функцию объединения групп, что-то вроде следующего в C #:

var result = from customer in data.Customers
             join docStat in data.DocumentStatistics
                    on customer.CustomerID equals docStat.CustomerID into stats
             where stats.Count() > 0
             select new
             {
                 Customer = customer,
                 LastStatCheck = stats.Min(res => res.StatDateTime)
             };

и в VB.Net

Dim result = From customer In data.Customers _
             Group Join docStat In data.DocumentStatistics _
                  On customer.CustomerID Equals docStat.CustomerID Into stats = Group _
             Where stats.Count() > 0 _
             Select New With _
             { _
                 .Customer = customer _
                 .LastStatCheck = stats.Min(Function(res) res.StatDateTime) _
             }
1 голос
/ 15 декабря 2009

Что вы действительно хотите, так это групповое присоединение.

C # Пример:

var query = from c in data.Customers
            join ds in data.DocumentStatistics
            on c.CustomerID equals ds.CustomerID into stats
            select new
            {
                Customer = c,
                LastStatCheck = stats.Min(s => s.StatDateTime)
            };
1 голос
/ 15 декабря 2009

Джон,

Проверьте продукт с именем Linqer (я не связан с этим продуктом). Он принимает оператор SQL и преобразует его в LINQ. Он способен конвертировать практически любой запрос, который вы ему набрасываете. Это было очень полезно для меня. Это также научило меня тому, как работает LINQ.

Randy

0 голосов
/ 15 декабря 2009

Linqer дал мне следующие результаты из моего оригинального оператора SQL:

From customer In data.Customers _
                    Select _
                    Customer = customer, _
                    LastStatCheck = (CType((Aggregate lastDateChecked In _
                    (From docStat In data.DocumentStatistics _
                    Where docStat.CustomerID = customer.CustomerID _
                    Select docStat) Into Min(lastDateChecked.StatDateTime)), DateTime?))

Полезная вещь в Linqer состояла в том, что я могу поместить оператор t-SQL и выполнить запрос рядом с оператором LINQ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...