Подтвердить что ты не робот

Возврат отличительного 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, чтобы сделать эту работу так, как я ее намерен?

4b9b3361

Ответ 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 здесь.