Возврат отличительного IQueryable с помощью LINQ?
Я пишу функцию, которая извлекает записи из базы данных с помощью LINQ, чтобы получить IQueryable. Этот оператор LINQ будет вытаскивать все записи для активных пользователей в течение определенного периода времени, а затем наплевать имя пользователя, имя и фамилию на Telerik RadGrid.
Моя проблема заключается в попытке получить отличительное значение на идентификаторе пользователя, когда вы тянете эти данные. Я попытался переработать этот код, чтобы получить результат. Вот пример кода, который вытягивает все данные, при этом Distinct NOT не работает.
public static IQueryable GetActiveEmployees_Grid(string Period)
{
DataContext Data = new DataContext();
var Employees = (from c in DataSystem_Records
where c.Period == Period
orderby c.DataSystem_Employees.LName
select c).Distinct();
return Employees;
}
После применения DataSource к моей Grid, это возвращает пользователя 4 раза, по одному экземпляру для каждой записи за этот период.
![alt text]()
Есть ли способ применить Distinct к моей функции LINQ, чтобы сделать эту работу так, как я ее намерен?
Ответы
Ответ 1
Самый простой способ, с помощью которого я нашел это, - использовать группу, а затем выбрать первый.
public static IQueryable GetActiveEmployees_Grid(string Period)
{
DataContext Data = new DataContext();
var Employees = (from c in DataSystem_Records
where c.Period == Period
orderby c.DataSystem_Employees.LName
select c).GroupBy(g=>g.DataSystem_Employees.AccID).Select(x=>x.FirstOrDefault());
return Employees;
}
Это не проверено, но существует общая концепция.
Изменить. Я помню, как первоначально нашел ответ где-то здесь. Проверьте это для группировки объектов по определенному свойству.
LINQ's Distinct() для определенного свойства
Ответ 2
Если вы ограничиваете объекты, которые вы возвращаете, только поля, которые вы хотите отобразить, они будут работать правильно.
public static IQueryable GetActiveEmployees_Grid(string Period)
{
DataContext Data = new DataContext();
var Employees = (from c in DataSystem_Records
where c.Period == Period
orderby c.DataSystem_Employees.LName
select c.DataSystem_Employees.FName,
c.DataSystem_Employees.LName,
c.ID).Distinct();
return Employees;
}
Ответ 3
попробуйте написать IEqualityComparer<T>
для выбранного типа объекта и использовать его в методе Distinct
Ответ 4
Выполнение некоторых предположений вокруг имен различных полей в объектах:
public static IQueryable GetActiveEmployees_Grid(string Period)
{
DataContext Data = new DataContext();
var Employees = (from c in DataSystem_Records
where c.Period == Period
orderby c.DataSystem_Employees.LName
select new { FirstName = c.DataSystem_Employees.FName, LastName = c.DataSystem_Employees.LName, ID = c.DataSystem_Employees.ID }).Distinct();
return Employees;
}
Чтобы следовать шаблону MVC, вы можете поднять этот запрос в свою модель и вернуть определенный класс, содержащий эти поля.
Ответ 5
Для этого используйте метод Distinct().
Например:
var query = from Notification in db.Notifications
select Notification.client ;
query=query.Distinct();
Результирующий запрос будет содержать только отдельные значения.
Ответ 6
Проблема заключается в том, что вы отбрасываете поля, которые сделают каждую строку отличной. Как сказал sgriffinusa, отмените только 3 значения, которые вы показываете.
Ответ 7
Возможно, вы захотите реализовать пользовательский метод сравнения для метода Distinct. См. Предыдущий вопрос SO здесь.