Конвертировать Linq IQueryable <string>в Linq IQueryable - PullRequest
1 голос
/ 06 января 2020

Я новичок в использовании Linq Queries и пытаюсь преобразовать IQueryable в пользовательский тип, но у меня возникают проблемы. Смотрите код ниже; Я пытался добавить .ToList<>() Я пытался использовать .Cast<>(), и ничего не работает. Любое понимание было бы замечательно.

Ошибка: невозможно неявное преобразование типа 'System.Linq.IQueryable<string>' в 'System.Linq.IQueryable<eSTIP.Models.User>'. Существует явное преобразование (вам не хватает приведения?)

private static List<UserViewModel> _allBCCUsers = null;
public static List<UserViewModel> AllBCCUsers
{
    get
    {
        if (_allBCCUsers == null)
        {
            eSTIPContext ctx = new eSTIPContext();
            IQueryable<User> users = from u in ctx.BBCRecipient select u.Email; //Error On this line

            _allBCCUsers = new List<UserViewModel>();
            foreach (User u in users)
                _allBCCUsers.Add(new UserViewModel(u));

        }
        return _allBCCUsers;
    }
}

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Как я понял из вашего вопроса, вы хотите вернуть список UserViewModel, который содержит User, которые имеют Email.

. Для этого вы можете напрямую выбрать List<UserViewModel> из LINQ. без необходимости итерации:

private static List<UserViewModel> _allBCCUsers = null;
public static List<UserViewModel> AllBCCUsers
{
    get
    {
        if (_allBCCUsers == null)
        {
            eSTIPContext ctx = new eSTIPContext();
            _allBCCUsers = (from u in ctx.BBCRecipient select new UserViewModel(new User() { Email = u.Email })).ToList();

        }
        return _allBCCUsers;
    }
}
0 голосов
/ 06 января 2020

Компилятор точно объясняет, что происходит в вашем коде.

С помощью from u in ctx.BBCRecipient select u.Email вы выбираете только свойство Email из u (пользователи?), Которое является строкой , и вы пытаетесь сохранить его в IQueryable типа Пользователь .

Теперь у вас есть два варианта: изменить свой выбор на select u (как сказал @Holger) или изменить на IQueryable<string>, но в этом случае вам нужно больше драматических c изменений в вашем после кода.

...