Linq. Union и Nullable
От: Аноним  
Дата: 22.02.11 06:53
Оценка:
Делаю обычную группировку типовно странная какая-то вещь происходит
так всё работает

 class Program
    {
        class City
        {
            public int? newCityID;
            public int oldCityID;
        }


        static void Main(string[] args)
        {
            City c1 = new City
                          {
                              newCityID = 1,
                              oldCityID = 1
                          };

            City c2 = new City
            {
                newCityID = 0,
                oldCityID = 2
            };

            City c3 = new City
            {
                newCityID = 0,
                oldCityID = 1
            };

            City c4 = new City
            {
                newCityID = 4,
                oldCityID = 4,
                dt = DateTime.Now
            };

            var cities = new List<City> { c1, c2, c3, c4 };

            var arr1 = cities.Where(i => i.newCityID != 0).GroupBy(i1 => i1.newCityID.GetValueOrDefault()).ToList();
            var arr2 = cities.Where(j => j.newCityID == 0).GroupBy(j1 => j1.oldCityID).ToList();

            var nc = cities.Where(i => i.newCityID != 0).Select(g => new
                                                                         {
                                                                             unionCityID = g.newCityID.GetValueOrDefault(),
                                                                             g
                                                                         })
                .Union(cities.Where(i => i.newCityID == 0).Select(g => new
                                                                           {
                                                                               unionCityID = g.oldCityID,
                                                                               g
                                                                           }))
                .GroupBy(r => r.unionCityID).ToList();
        }

    }


но стоит заменить выделенную g на g1 во втором селекте и начинает выкидывать ошибку
что такое? ведь второй селект не видит первый
Re: Linq. Union и Nullable
От: Пельмешко Россия blog
Дата: 23.02.11 11:17
Оценка: 36 (1) +3
Здравствуйте, Аноним, Вы писали:

А>но стоит заменить выделенную g на g1 во втором селекте и начинает выкидывать ошибку

А>что такое? ведь второй селект не видит первый

Потому что результатами Select'ов становятся разные типы, которые не могут быть объеденены Union'ом.
Когда вы делаете так:
new {
   unionCityID = g.oldCityID,
   g
}

..Вы создаёте анонимный тип с полем 'unionCityID' типа int и полем 'g' типа City.
Обратите внимание на имена полей — их можно либо указать явно, либо они возьмутся из выражения, если это возможно.
Заменив g на g1, Вы просто создадите другой анонимный тип с вторым полем 'g1', который не будет иметь ничего общего с анонимным типом, возвращаемым первым Select'ом.
Re[2]: Linq. Union и Nullable
От: Аноним  
Дата: 24.02.11 05:06
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Здравствуйте, Аноним, Вы писали:


А>>но стоит заменить выделенную g на g1 во втором селекте и начинает выкидывать ошибку

А>>что такое? ведь второй селект не видит первый

П>Потому что результатами Select'ов становятся разные типы, которые не могут быть объеденены Union'ом.

П>Когда вы делаете так:
П>
П>new {
П>   unionCityID = g.oldCityID,
П>   g
П>}
П>

П>..Вы создаёте анонимный тип с полем 'unionCityID' типа int и полем 'g' типа City.
П>Обратите внимание на имена полей — их можно либо указать явно, либо они возьмутся из выражения, если это возможно.
П>Заменив g на g1, Вы просто создадите другой анонимный тип с вторым полем 'g1', который не будет иметь ничего общего с анонимным типом, возвращаемым первым Select'ом.

действительно, если указать new { myCity = g ...} то всё работает
Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.