Как я могу использовать этот запрос T-SQL в LINQ / Entity Framework? - PullRequest
1 голос
/ 07 августа 2009

Я имею дело только с одной таблицей базы данных / объектом сущности: NodePath.

Для данного конкретного узла я хочу получить только подмножество всех его NodePaths согласно этому запросу:

select
    *
from
    NodePath
where
    NodeId = @GivenNodeId and
    Id in
    (
        --active paths
        select
            a.Id
        from
            NodePath a join
        (
                select
                    [Path],
                    max(Created) as Created
                from
                    NodePath
                group by
                    [Path]
        ) b on
        a.[Path] = b.[Path] and
        a.Created = b.Created
    )

Как я могу выполнить это в моем приложении VB.NET?

Dim AllPaths = GivenNode.NodePaths.OrderByDescending(Function(p) p.Created)

Dim ActivePaths = ???

Ответы [ 2 ]

3 голосов
/ 07 августа 2009

Я считаю, что я правильно перевел этот SQL, но я могу внести изменения, если это необходимо. Это выбирает один NodePath для каждого общего Path (на основе наибольшего Created), при условии, что он соответствует NodeId.

C # Решение:

var nodePaths = (from p in context.NodePaths
                 group p by p.Path into g
                 select g.OrderByDescending(i => i.Created).First()
                 ).Where(p => p.NodeId == givenNodeId);

VB.NET Solution (я думаю, не мой основной язык):

Dim nodePaths = (From p In context.NodePaths _
                 Group p By p.Path Into Group _
                 Select Group.OrderByDescending(Function(i) i.Created).First() _
                 ).Where(Function(p) p.NodeId = givenNodeId)
2 голосов
/ 07 августа 2009

Вы можете создать хранимую процедуру, а затем добавить ее в вызываемую модель EDMX (модель). Просто щелкните правой кнопкой мыши и выберите «Обновить модель из базы данных», там должна быть вкладка хранимых процедур. Смотри также здесь .

Найдите хранимую процедуру в Обозревателе моделей.

Щелкните правой кнопкой мыши и выберите «Создать функцию импорта».

Функция создания модели данных объекта Импорт http://img31.imageshack.us/img31/9100/createfunctionimport.gif

Выберите тип возвращаемых объектов. (в данном случае: NodePath)

Вызовите функцию из вашего кода:

Dim ActivePaths = context.ActivePaths(GivenNode.Id)

Если вы хотите сделать это без хранимой процедуры, вам придется использовать LINQ или Entity SQL. Или ADO.NET, конечно:)

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