Тип возврата для коллекции из LINQ Query - PullRequest
6 голосов
/ 15 октября 2010

У меня есть метод, который возвращает группу учетных записей

Public Shared Function GetAllNotesByUser(ByVal UserID As Guid) As Account (??)
    Using db As New MyEntity
        Dim query= (From A In db.Account _
                    Where A.aspnet_Users.UserId = UserID _
                    Select A)
        Return query
    End Using
End Function

Затем я хотел бы передать это другой функции для вычисления итогов по всем счетам в коллекции. Рекомендуется ли возвращать общий список Ienumerable, я просто не уверен, что лучше всего работает с LINQ и структурой сущностей.

Ответы [ 4 ]

7 голосов
/ 15 октября 2010

При распространении запроса LINQ с помощью методов таким способом лучший выбор для возвращаемого типа - IEnumerable(Of T) для LINQ для объектов или IQueryable(Of T) для других поставщиков LINQ.В данном случае это выглядит так: Account - это тип, поэтому IEnumerable(Of Account) или IQueryable(Of T) в зависимости от типа запроса.

2 голосов
/ 15 октября 2010

Лучший тип:

IEnumerable<Account>

или соответствующий синтаксис в VB: P

На самом деле все функции LINQ (.Where(), .Distinct() и т. Д.) Являются методами расширенияна IEnumerable<T>, я думаю, что хорошей практикой является продолжение цепочки таким же образом.

1 голос
/ 15 октября 2010

Хороший ответ здесь на IEnumerable<T> против IQueryable<T>.

Я бы использовал IQueryable(Of T), если вы хотите еще больше ограничить набор в вызывающей стороне методаНапример, с предложением WHERE.В противном случае я бы использовал IEnumerable(Of T), если бы все вызывающие стороны знали, что им нужно выполнить ToList () для результата, если они планируют повторять его более одного раза (в противном случае вы бы сделали несколько вызовов в базу данных).Если вызывающие не знают, я, вероятно, использовал бы ICollection(Of T) и выполнял бы ToList () в самом методе.

0 голосов
/ 15 октября 2010

Вопрос, который вам нужно задать: «Когда мне нужно, чтобы SQL действительно выполнялся?»В LINQ это разница между отложенным и немедленным выполнением.Любой метод, который возвращает IEnumerable<>, должен выполнить запрос, чтобы получить результаты.IQueryable<>, с другой стороны, задерживает выполнение запроса до тех пор, пока к нему не будет вызван метод, который возвращает IEnumerable<>.В приведенном вами примере может быть быстрее передать результат функции GetAllNotesByUser как IQueryable<>, так что вы выполняете один запрос вместо двух:

public static IQueryable<Account> GetAllNotesByUser(Guid UserId)
{
    ...
}

Возможны ситуациигде вам нужно перечислить результат GetAllNotesByUser без выполнения каких-либо дополнительных манипуляций.Помните, что в этих случаях вы можете вызвать ToList () для принудительного выполнения запроса.

var result = GetAllNotesByUser(<guid>).ToList();
...