Проблемы преобразования T-Sql в linq (упорядочены по) - PullRequest
0 голосов
/ 15 ноября 2010

У меня возникли проблемы с преобразованием следующего оператора t-sql в Linq (с использованием структуры сущностей 4.0)

Я получаю

Невозможно привести тип 'System.Linq.IOrderedQueryable 1' to type 'System.Linq.IQueryable 1'. LINQ для сущностей поддерживает только приведение Типы примитивов модели данных объекта.

T-SQL

    SELECT 
    I.Id
    , I.Name
FROM Inventory I
WHERE I.Id in 
    (
    select top 5 applicationId 
    from LastViewed 
    group by ApplicationId, SomeUserId
    having SomeUserId = @SomeUserId
    order by Max(id) desc
    )

Это то, что у меня сейчас (с помощью Linqer)

    Dim query As IQueryable(Of Inventory) =
        From d In ctx.Inventories
        Where
            ((From e In ctx.LastVieweds _
            Group e By _
              e.ApplicationId, _
              e.SomeUserId _
             Into g = Group _
            Where DfaitEdsId = user _
            Order By g.Max(Function(p) p.Id) Descending _
            Select New With { _
              ApplicationId _
            }).Take(5)).Contains(New With {.ApplicationId = d.Id}) _
        Select d

в данный момент происходит сбой при выполнении этой строки.

query.ToList()

Спасибо за ваше время.

1 Ответ

3 голосов
/ 15 ноября 2010

Ваша «проблема» в вашей первой строке. Заданный вами запрос возвращает IOrderedQueryable(Of Inventory), который вы пытаетесь присвоить переменной типа IQueryable(Of Inventory). Вы не получите ошибку до query.ToList() благодаря отложенному выполнению. Вы можете разрешить компилятору выводить тип, если в вашем проекте установлено значение option infer, и ваш запрос будет выглядеть примерно так:

Dim query =
        From d In ctx.Inventories
        Where
            (From e In ctx.LastVieweds _
            Group e By _
              e.ApplicationId, _
              e.SomeUserId _
             Into g = Group _
            Where DfaitEdsId = user _
            Order By g.Max(Function(p) p.Id) Descending _
            Select ApplicationId Take 5 _
            ).Contains(d.Id) _
        Select d

Или вы можете просто изменить тип query на IOrderedQueryable(Of Inventory)

Примечание: то, что у вас хорошо работает в Linq to SQL, но сущности гораздо строже, когда дело доходит до приведения.

Изменить: Хорошо, давайте попробуем углубиться в это. Скажи мне, какая линия взрывается со следующим:

Dim innerList = (From e In ctx.LastVieweds _
                Group e By _
                e.ApplicationId, _
                e.SomeUserId _
                Into g = Group _
                Where DfaitEdsId = user _
                Order By g.Max(Function(p) p.Id) Descending _
                Select ApplicationId Take 5).ToList()
Dim query = (From d In ctx.Inventories
            Where innerList.Contains(d.Id) _
            Select d).ToList()

Не забудьте немного уменьшить результаты, если перечисление запросов с помощью ToList () слишком много. Типы обеих переменных теперь List(Of Inventory)

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