2012-01-05 1 views
3

안녕하세요 내가 같은 테이블을 가지고 =>LINQ를 사용하여 고유 값을 얻는 방법?

내가 얻을 필요가
stateID requestNo reqStateID  reqStateDate 
     1   1    13  03.01.2012 10:57 
     2   1    3  03.01.2012 10:58 
     3   2    3  03.01.2012 11:14 
     4   2    3  03.01.2012 11:15 
     5   1    5  03.01.2012 22:28 
     6   1    7  05.01.2012 14:54 
     7   3    3  05.01.2012 14:55 

, 마지막에 추가 (reqStateDate) 고유의 요청 없음 (requestNo). 나는 이런 식으로 뭔가를 시도했지만 작동하지 않을 것 ...

public List<ReqStates> GetRequests(int reqStateID) 
    { 
     return (from rs in db.ReqStates 
          where rs.reqStateID== reqStateID 
          orderby rs.reqStateDate descending 
          select rs).Distinct().ToList();    
    } 

매개 변수 (reqStateID가), (3) 소요 내가이 개 요청을받을 경우. requestNo = 2 및 requestNo = 3입니다. 요청의 reqstateID가 모두 3이고 추가 된 날짜가 최신이기 때문에. RequestNo = 1 => 마지막으로 추가 된 상태는 13입니다. 이 때문에 it (1)이 오지 말아야합니다.

누군가가 나를 도울 수 있기를 바랍니다.

답변

5

당신은 어떤 특성이 구별해야 값으로 Distinct 말할 필요 봅니다. 아무것도 지정되지 않은 경우 값을 구별하기 위해 기본 동등 비교자를 사용합니다.

  1. 는 별개로 IEqualityComparer을 전달합니다

    현재 두 가지 옵션이 있습니다.

  2. ReqStatesIEquatable을 구현하십시오.

예 : 만 최종 쿼리 작업으로 사용할 수있는 '우선' "방법 방법을 사용하여 고려 'FirstOrDefault'이 경우 대신 :

class ReqStatesComparer: IEqualityComparer<ReqStates> 
{ 
    public bool Equals(ReqStates a, ReqStates b) 
    { 
    return a.requestNo == b.requestNo; 
    } 

    public int GetHashCode(ReqStates rs) 
    { 
    return rs.GetHashCode(); 
    } 
} 


    public List<ReqStates> GetRequests(int reqStateID) 
    { 
     return (from rs in db.ReqStates 
          where rs.reqStateID== reqStateID 
          orderby rs.reqStateDate descending 
          select rs).Distinct(new ReqStatesComparer()).ToList();    
    } 
+0

IEqualityComparer를 사용하여 샘플을 보내 주시겠습니까? – blackraist

+0

큰 이해할 수있는 예, 감사합니다. – blackraist

2

ID 번호가 지정된 최신 reqStateDate으로 requestNo의 최신 요청을 검색하는 것처럼 들립니다. 이 경우, 당신은 할 수 있습니다 :

public List<ReqStates> GetRequests(int reqStateID) 
{ 
    return db.ReqStates.Where(rs => rs.reqStateID == reqStateID) 
         .GroupBy(rs => rs.requestNo) 
         .Select(g => g.OrderByDescending(rs => rs.reqStateDate).First()) 
         .ToList();    
} 
+0

나는이 시도는하지만 난 오류가 발생합니다. . " FirstOrDefault()로 First()를 대체했지만 이번에는 "명령 정의를 준비하는 동안 오류가 발생했습니다. 자세한 내용은 내부 예외를 참조하십시오." 오류가 발생했습니다. – blackraist

+0

이고 내부 예외는 { "지정된 메서드가 지원되지 않습니다."} – blackraist

+0

@ user892945 LINQ to SQL 또는 EF입니까, 아니면 LINQ to Objects입니까? (위의 개체 Linq 잘 ...) –

3

나는 당신이 찾고 있지만 전체 개체에 뚜렷한을하고 결과를 정확히 모르겠어요. 따라서 객체는 모든 필드에서 구별되어야합니다.

전체 개체가 아닌 필드를 선택하는 곳에서 아래를 시도해보십시오.

그런 다음 필요한 필드 만 사용하도록 수정하십시오.

return (from rs in db.ReqStates 
         where rs.reqStateID== reqStateID 
         orderby rs.reqStateDate descending 
         select rs.requestNo).Distinct().ToList(); 
+0

나는 이미 그걸 시도했지만 그게 나에게 모든 요청을 주었다. 그게 reqStateID == 3을 가지고있다. 첫 번째 조건은 요청 추가 날짜 (reqStateDate)가 최신이어야하고 reqStateID == 3이어야합니다. – blackraist