Группировка datatable, вызывающая исключение ссылочной ссылки в LINQ

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

var v = (from r in cTable.AsEnumerable()
 group r by r.Field<string>("Name") into g
 select new
 {
 CallType = g.Key,
 Count = g.Count()
 }); 
</string>

Это неплохо. Но когда я делаю изменения, добавляя

var v = (from r in cTable.AsEnumerable()
 group r by r.Field<string>("Name").Replace(",", "") into g
 select new
 {
 CallType = g.Key,
 Count = g.Count()
 }); 
</string>

Это дает мне Object Refrenence not set to instance errror Почему так? Я просто хочу, чтобы какая-либо запятая в столбце имени была исключена при группировке данных, то есть "Раджив" и "Ра, джев" должны считаться "Раджив" при группировке

2 ответа

Попробуйте это для безопасного решения:

var v = from r in cTable.AsEnumerable()
 let name = r.Field<string>("Name")
 group r by (name ?? "").Replace(",", "") into g
 select new {
 CallType = g.Key,
 Count = g.Count()
 }; 
</string>

Обратите внимание, что с указанным выше кодом все нулевые или пустые строки будут сгруппированы в одну и ту же группу. Если вы хотите отфильтровать все нулевые значения, просто добавьте их, например:

var v = from r in cTable.AsEnumerable()
 let name = r.Field<string>("Name")
 where name != null
 group r by name.Replace(",", "") into g
 select new {
 CallType = g.Key,
 Count = g.Count()
 }; 
</string>


Проверьте Null перед группировкой с помощью оператора Ternary, вы можете заменить null на некоторую строку, например: "или пустую строку, какой бы термин вы ни использовали для отображения нулевого ключа группы

var v = (from r in cTable.AsEnumerable()
 group r by r.Field<string>("Name") == null ? "<null>" : r.Field<string>("Name").Replace(",", "") into g
 select new
 {
 CallType = g.Key,
 Count = g.Count()
 });
</string></null></string>

Для получения дополнительной информации проверьте следующий блог:

http://infinitecodex.com/post/2010/07/05/LINQ-Group-By-with-NULL-database-values.aspx

licensed under cc by-sa 3.0 with attribution.