Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LINQ (Language-Integrated Query) > Linq List.Contains


Автор: CYBERDREAM 25.8.2010, 14:55
Всем доброго времени суток. 
Есть коллеция айдишников 
Код

List<Int32> uids;
//и табличка
Nsb


мне нужно вывести все записи, в которых поле UID содержится в коллекции uids
Код

var dddd = (from lt in _dbPduu.NsbDictionaryStructures where uids.Contains(lt.UID) select lt).DefaultIfEmpty();
//но при выполнении запроса выдает - NullReferenceException, что не так делаю? нельзя проверять на вхождение в коллекцию что ли?
foreach (var item in dddd)//вот здесь)
     Console.WriteLine(item.Name);



Автор: KelTron 26.8.2010, 07:59
Очевидно возвращается пустая коллекция, т.е. нет таких записей, а т.к. DefaultIfEmpty() то возвращается значение по умолчанию для данного типа т.е. null. Соответственно в foreach при вызове ddd.GetEnumerator() всё и валится..

Автор: CYBERDREAM 26.8.2010, 10:40
но дело в том, что данные должны быть, т.е. 2 записи у меня точно должны вернуться, но упорно возвращается нулл

Автор: mrbrooks 26.8.2010, 12:01
CYBERDREAM, попробуй использовать пересечение:
Цитата(CYBERDREAM @  26.8.2010,  11:40 Найти цитируемый пост)
но дело в том, что данные должны быть, т.е. 2 записи у меня точно должны вернуться, но упорно возвращается нулл


тем не менее не возвращает камрад. 
DefaultIfEmpty() по определению будет возвращать null в случае пустой результирующей коллекции. задай ему значение по умолчанию. или перед выводом коллекции делай проверку на null.  хотя и обработать исключение дело конечно не грешное.
В общем оцени данные в используемых коллекциях. Судя по результату у них нет общих точек соприкосновения.

Автор: CYBERDREAM 26.8.2010, 12:41
вот и я гадаю почему,точно знаю что две записи должны вернуться, но увы и ах) 
повожусь с кодом еще, полюбому какая то фигня зарылась

Автор: Сарт 9.9.2010, 13:06
Код

    class IntClass
    {
        public int UID
        { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<int> testList = new List<int>() { 1, 1, 2, 3, 5 };
            List<IntClass> tipoTable = new List<IntClass>()
            { new IntClass() { UID=1},
                new IntClass() { UID=2},
            };
            List<int> result = (from res in tipoTable join
                                                 tl in testList  
                                                 on res.UID equals tl
                                                 select res.UID).ToList();

        
        }


Так не подойдет? Возвращает 3 записи.

П.С. 
сразу не заметил, что в вопросе фактически 2 массива)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)