Оператор Linq-To-SQL .ToList () - PullRequest
       1

Оператор Linq-To-SQL .ToList ()

1 голос
/ 27 августа 2010

Есть ли лучший способ сделать это?

У меня есть запрос Linq-To-SQL, который мне нужен для возврата объектов, определенных абстрактными интерфейсами (например, IList ), а не конкретных объектов (напримерList ).

// получить пользователей из контекста данных

        List<User> users;

        using (AbleridgeDataContext context = new AbleridgeDataContext())
        {

            users = (from u in context.Users select u).ToList();
        }

        // reassign concrete users to abstract interfaces

        IList<IUser> genericUsers = new List<IUser>();

        foreach (var user in users)
        {
            IUser genericUser = user;
            genericUsers.Add(genericUser);
        }

        return genericUsers;

Ответы [ 5 ]

2 голосов
/ 27 августа 2010
return context.Users.Cast<IUser>().ToList();

В качестве альтернативы:

List<IUser> users = new List<IUser>(context.Users);
1 голос
/ 27 августа 2010

Вы можете привести к IUser в проекционной части запроса:

    List<User> users;
    using (AbleridgeDataContext context = new AbleridgeDataContext())
    {
        return from u in context.Users select (IUser)u;
    }

Единственное изменение, которое для этого потребуется, - заставить вашу функцию возвращать IEnumerable<IUser>, что было бы лучше в любом случае, потому что запрос выиграл 'не будет выполняться до тех пор, пока вызывающий не начнет перечисление.

Хотя вы также можете просто использовать ToList, если вы не заинтересованы в его изменении.

Обновление На самом деле вывероятно, захочет использовать ToList здесь, потому что оператор using избавляется от контекста данных, как только функция возвращается, так что отложенный запрос не будет выполнен.

0 голосов
/ 27 августа 2010

с веб-сайта MSDN :

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)

Вы пробовали context.Users.ToList<IUser>()?

Также, что касается контекста, метод ToList заставит запрос быть оцененным, поэтому результат будет доступен после удаления контекста.

0 голосов
/ 27 августа 2010

Объявите пользователей как IList и приведите пользователя к IUser с помощью linq.

ToList возвращает IEnumerable, в котором реализованы мои IList и List, поэтому действительно не имеет значения, какой из них вы объявите users как.

    IList<IUser> users;
    using (AbleridgeDataContext context = new AbleridgeDataContext())
    {
        users = (from u in context.Users select u).Cast<IUser>().ToList();
    }
0 голосов
/ 27 августа 2010

Попробуйте вместо этого. Вернется IEnumerable<IUser>

using (AbleridgeDataContext context = new AbleridgeDataContext())
{
    return context.Users.Select((IUser)u);
}

Если вы действительно хотите IList, установите тип возвращаемой функции на IList<IUser> и добавьте .ToList() в конец оператора возврата.

Или

return context.Users.OfType<IUser>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...