2010-12-17 5 views
12

IQueryable을 얻기 위해 LINQ를 사용하여 데이터베이스에서 레코드를 가져 오는 함수를 작성했습니다. 이 LINQ 문은 특정 기간 내에 활성 사용자에 대한 모든 레코드를 가져온 다음 Telerik RadGrid에 UserID, First Name 및 Last Name을 내뱉습니다.LINQ를 사용하여 고유 한 IQueryable을 반환 하시겠습니까?

내 데이터를 가져올 때 UserID에 고유 값을 가져 오는 중 문제가 있습니다. 내 결과를 얻기 위해이 코드를 다시 시도했다. 다음은 Distinct NOT을 사용하여 모든 데이터를 가져 오는 코드의 예입니다.

그리드에 DataSource를 적용한 후 해당 기간의 각 레코드에 대해 하나의 인스턴스를 4 번 사용자에게 반환합니다.

alt text

이 작품을 내가 그것을하려는 길을 내 LINQ 기능에 고유 적용 할 수있는 방법이 있나요?

답변

20

개체로이 작업을 수행 한 가장 간단한 방법은 groupby를 사용하여 가장 먼저 선택하는 것입니다.

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() on a particular property

+1

GroupBy가 완벽하게 작동했습니다!처음에는 문제 해결시 GroupBy를 시도했지만, .Select (x => x.FirstOrDefault())를 놓쳤습니다. 감사! – Lando

+0

순서는 첫 번째 또는 기본 앞에 그룹에 따라 선택해야합니다. 로그인 시간에 관심이 있다고 가정합니다. –

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 c.DataSystem_Employees.FName, 
          c.DataSystem_Employees.LName, 
          c.ID).Distinct(); 

    return Employees; 
} 
+0

이것은 이론상으로 효과가 있었지만 IntelliSense는 하나 이상의 엔터티를 정책에 추가하려고 할 때 나를 거부했습니다. – Lando

+0

어떤 오류가 발생합니까? – sgriffinusa

+0

@sgriffinusa, 당신은'new {}'를 선택해야합니다. 당신의 구문이 유효하지 않습니다. –

4

시도 및 객체 유형에 대한 IEqualityComparer<T> 쓰기 선택하고 Distinct 방법

+2

이것은 구성된 질의가 아닌 객체에 linq를 사용합니다. –

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 new { FirstName = c.DataSystem_Employees.FName, LastName = c.DataSystem_Employees.LName, ID = c.DataSystem_Employees.ID }).Distinct(); 

    return Employees; 
} 

MVC 패턴을 따르려면이 쿼리를 모델로 가져 와서 해당 필드가 들어있는 특정 클래스를 반환 할 수 있습니다.

-1

문제는 각 행을 구별하게하는 필드를 뒤로 당기는 것입니다. sgriffinusa가 말했듯이, 표시하고있는 3 개의 값만 되돌립니다.

-1

Distinct 메서드에 대한 사용자 지정 비교자를 구현할 수 있습니다. 이전 SO 질문 here을 참조하십시오.

0

이렇게하려면 Distinct() 메서드를 사용하십시오. 예는 :

var query = from Notification in db.Notifications 

         select Notification.client ; 
      query=query.Distinct(); 

결과 쿼리는 고유 한 값이 포함됩니다.

관련 문제