2013-08-08 5 views
0

У меня есть следующий Linq, и я хотел бы сгруппировать по c.RegisterId (string) начинается со строки. Так, например, я хотел бы, чтобы все следующие примеры попадали в одну группу.LINQ group by "содержит строку"

12345 
1234500 
123450 


from c in _companyRepository.GetAll() 
group c by c.RegisterId into grpCompany 
select grpCompany 
+4

Как вы определяете группу? Это '12345' или' 123'? –

ответ

2
var res = from c in _companyRepository.GetAll() 
      group c by c.RegisterId.Length <= 5 ? 
        c.RegisterId : 
        c.RegisterId.Substring(0, 5) into grpCompany 
      select grpCompany 

Вы хотели группируя в течение первых 5 символов, не так ли? :-)

Замечу, что запрос, выполняемый SQL, вероятно, не требует проверки длины.

SELECT SUBSTRING('Hello', 1, 10000) 

работает всегда (возвращение Hello). Это отличается от .NET где "Hello".Substring(0, 10000) взрываются, так что, вероятно,

var res = from c in _companyRepository.GetAll() 
      group c by c.RegisterId.Substring(0, 5) into grpCompany 
      select grpCompany 

достаточно.

+0

Хорошо, что круто. Как насчет того, хочу ли я использовать некоторую функцию подобия, например, «расстояние Левенштейна» или что-то подобное. –

+0

@JernejNovak Вы не можете делать забавные вещи на SQL Server (если вы не реализуете свои методы в SQLCLR). Вы можете сделать это на местном. – xanatos

1

Вам нужно будет решить, сколько букв слева вы хотите рассмотреть базовый общий идентификатор (например, 5).

from c in _companyRepository.GetAll() 
group c by c.RegisterId.Substring(0, 5) into grpCompany 
select grpCompany 
1

Вы можете сделать это

_companyRepository.GetAll().GroupBy(x=>x.Substring(0,4));