2009-08-06 3 views
1

Я имею дело только с одной таблицей базы данных/объектом объекта: NodePath.Как использовать этот запрос T-SQL в LINQ/Entity Framework?

Учитывая конкретный узел, я хочу, чтобы получить только подмножество всех его 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

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

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

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

Entity Data Model Create Function Import http://img31.imageshack.us/img31/9100/createfunctionimport.gif

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

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

Dim ActivePaths = context.ActivePaths(GivenNode.Id) 

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

+0

Я обновил этот ответ с большим количеством шагов. Спасибо, Марсель. –

3

Я считаю, что я правильно перевел этот 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 Решение (я думаю, не мой основной язык):

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) 
+0

Это немного странно, поскольку он захватывает NodePath с наибольшим Созданный сначала, а затем фильтры. Похоже, что работает SQL-запрос, поэтому я написал его так. –

+0

Кроме того, я написал это с помощью LinqToSql, но я не вижу ничего, что могло бы вызвать проблемы в Entity Framework. –

+0

Спасибо, Райан. На данный момент я решил пойти с предложенным Марселем. Я знаю, что должен в конечном итоге заставить себя чувствовать себя более комфортно с LINQ. –

Смежные вопросы