LINQ Query За исключением того, что не работает, List <long?> Vs. List <long> - PullRequest
4 голосов
/ 06 июля 2011

То, что я пытаюсь сделать, - это сузить результаты запроса, который я буду использовать для привязки данных позже.Я хочу получить все ProgramId, которые используются в моем gridview, и удалить их из источника данных моего выпадающего списка (то есть, чтобы пользователь не мог выбрать создание и вставку объекта в gridview того же ProgramId, что и тот, который ужесуществует)

Вот код:

var query = from goals in DataContext.Goals
            select goals;
var query2 = (from goals in query.AsEnumerable()
              select goals.ProgramId).ToList(); //List<long?>
var query3 = (from progs in DataContext.Programs
              select progs.ProgramId).ToList(); //List<long>
var cgps = query3.Except(query2);

И я получаю эти ошибки на var cgps = query3.Except(query2);:

Ошибка 29 'System.Collections.Generic.List 'не содержит определения' Except 'и лучшей перегрузки метода расширения' System.Linq.ParallelEnumerable.Except (System.Linq.ParallelQuery, System.Collections.Generic.IEnumerable) 'имеет несколько недопустимых аргументов C: ... \ Shmeh \ Shmeh \ Shmeh \ this.aspx.cs 24 226 Проект

Ошибка 30 Аргумент экземпляра: невозможно преобразовать из 'System.Collections.Generic.List' в 'System.Linq.ParallelQuery' C :... \ Shmeh \ Shmeh \ Shmeh \ this.aspx.cs 24 226 Проект

Если у вас есть идея, как правильно делать то, что я пытаюсь сделать, любая помощь будет принята с благодарностью!Спасибо!

Ответы [ 6 ]

9 голосов
/ 06 июля 2011

Except требует, чтобы последовательности были одного типа. Попробуйте привести список long к long?:

var query3 = (from progs in DataContext.Programs
              select (long?)progs.ProgramId).ToList(); //List<long?>
5 голосов
/ 06 июля 2011

Вы получаете эту ошибку, потому что long? отличается от типа long. Except требует, чтобы оба перечисляемых объекта были одного типа.

Что вы можете сделать, это удалить нулевые значения из query2 и преобразовать ProgramId в long

var query2 = (from goals in query.AsEnumerable()
              where goals.ProgramId.HasValue
              select goals.ProgramId.Value).ToList()
2 голосов
/ 06 июля 2011

попробуй

var cgps = query3.Cast<long?>().Except(query2);
1 голос
/ 06 июля 2011
var cgps = DataContext.Programs.Select(p => p.ProgramId)
    .Except(DataContext.Goals.Where(g => g.ProgramId.HasValue).Select(g => g.ProgramId.Value));
0 голосов
/ 06 июля 2011

Я не знаю, почему он / она удалил свой ответ, но я использую это:

dropdownlist.DataSource = (
            from progs in DataContext.Programs
            where !(from goals in query.AsEnumerable()
                    select goals.ProgramId)
                   .Contains(progs.ProgramId)
            select progs.Name).ToList();
dropdownlist.DataBind();

Потому что это не требует от меня использования нескольких переменных запроса, хотя ответ, который я принял, сработал так же, как и у меня.

0 голосов
/ 06 июля 2011

Я не знаю, сработает ли это для вас.

var query2 = (from goals in query.AsEnumerable()
              select goals.ProgramId).ToList() as List<long?>;

var query3 = (from progs in DataContext.Programs
              select (long?)progs.ProgramId).ToList() as List<long?>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...