2013-06-05 2 views
1

У меня есть начальный запрос, который я хочу изменить, чтобы увеличить детализацию в моих результатах. Но Visual Studio говорит, что мой запрос недействителен, и я не понимаю, почему. В основном я хочу сгруппировать свои данные в соответствии со 2 свойствами (столбцами), а также группировать одно из свойств по первым N символам.Linq to Sql, свойство group by 2 и подстрока

Первоначальный запрос, который работает:

List<PostalCode> codes = (from customer in bd.Customers 
         group customer by customer.postalcode.Substring(0, postalCodeLength) into postalCodes 
         select new PostalCode 
         { 
          Postal = postalCodes.Key, 
          Count = postalCodes.Count() 
         }).ToList(); 
       return codes; 

запрос отмеченную **, как неправильно, VS2010:

List<PostalCode> codes = (from customer in bd.Customers 
          group customer by new { **customer.postalcode.Substring(0, postalCodeLength)**, customer.CustomerGroupType} 
          into postalCodes 
          select new PostalCode 
          { 
           Postal = postalCodes.Key.postalcode, 
           CustomerGroupType = postalCodes.Key.CustomerGroupType, 
           Count = postalCodes.Count() 
          }).ToList(); 
return codes; 

ответ

3

Новый синтаксис {} объект требует, чтобы свойства имеют имена - то исходный запрос сделал не требуется. Он не может вывести имя из вашего вызова метода. Поэтому я бы рекомендовал изменить его на что-то вроде:

from customer in bd.Customers 
group customer by new { TrimmedPostalCode = customer.postalcode.Substring(0, postalCodeLength), customer.CustomerGroupType} 
into postalCodes 
select new PostalCode 
{ 
    Postal = postalCodes.Key.TrimmedPostalCode, 
    CustomerGroupType = postalCodes.Key.CustomerGroupType, 
    Count = postalCodes.Count() 
} 
+0

Действительно, это сработало. Мой вопрос к вам сейчас, почему второе свойство не требует имени? – guiomie

+1

Компилятор может вывести имя, потому что это просто свойство, а не вызов метода. Если вы думаете об этом, компилятор может увидеть только «последнюю вещь», которая произошла в первом случае - она ​​просто видит, что «метод подстроки был вызван, который возвращает строку» - он не может видеть, какое свойство вызывалось подстрокой. –