2016-06-04 2 views
-4

람다 쿼리에서 'Order'의 고유 목록을 가져올 수 없습니다. 키워드 Distinct()을 사용하고 있어도 반복되는 선택 목록 항목을 계속 반환합니다.Lambda Distinct not working

public ActionResult Index() 
{ 
     var query = _dbContext.Orders 
            .ToList() 
            .Select(x => new SelectListItem 
            { 
             Text = x.OrderID.ToString(), 
             Value = x.ShipCity 
            }) 
            .OrderBy(y => y.Value) 
            .Distinct(); 

     ViewBag.DropDownValues = new SelectList(query, "Text", "Value"); 

     return View(); 
} 

제안 사항을 알려주십시오.

UPDATE

죄송 사람 나는 진정으로 내 코드에서 Distinct()을 놓쳤다. 나는 지금 그것을 내 코드에 추가했다.

기본적으로 값이 같지만 ID가 다른 모든 별개의 행을 가져 오려고합니다. 이 SQL 쿼리와 동일

......

SELECT distinct [ShipCity] FROM [northwind].[dbo].[Orders] ORDER by ShipCity 
+8

귀하의 코드가 제로 *를 *했다가 '고유()를 호출'. –

+1

엔티티 프레임 워크를 사용할 때 몇 가지 일반적인 조언 (나는 _dbContext가 EF 컨텍스트라고 가정 함) : ToList() 호출은 마지막으로 수행해야합니다. Single(), First(), Last(), Any(), Count() 등등과 동일합니다 ... 요점은 ... EF는 데이터베이스에 왕복 여행을 할 수 없을 정도로 충분히 "똑똑"합니다. . 그래서 ... 목록을 열거하기 위해 호출하기 전에 Where(), Select(), OrderBy() 등을 수행하면 훨씬 효율적입니다. Entity Framework에 대해 좀 더 읽어 보시기 바랍니다. – Igor

+0

고유 전화 코드를 게시하십시오. 우리는 당신이 시도했거나 시도하려는 것을 이해해야합니다. –

답변

1

나는 쿼리의 끝에서 당신의 구별을 제거 있으리라 믿고있어.

실제로 그 문제에 대해서는 선택을 제외하고 쿼리를 수행하지 않고 데이터베이스의 테이블에 쿼리가 있기 때문에 복제 주문을 어떻게 얻을 수 있는지 보지 못하므로 이미 얻을 수 없습니다 동일한 행을 여러 번

"복제본"은 무엇이라고합니까? 중복되지 않은 ID를 제외하고 같은 값을 가진 두 행을 의미하는 경우, 두 값은 서로 관련이없는 행이며 값은 같습니다. . .

다른 한편으로는 당신이 선택 후에 .Distinct를 던져 버리고 거기에 중복이있는 OrderId와 ShipCity 만 사용하고 있기 때문에 당신이 평등하다고 생각한다면 (그리고 나는 정말로 ' Order 테이블의 OrderId 열에 중복이 있어야하지만 다른 문제가있는 이유를 확인하십시오. OrderId 나 ShipCity를 선택하지 않았기 때문에 여전히 작동하지 않습니다. 새 SelectListItem을 선택하고 두 개의 참조 유형을 만드는 경우 동일한 값을 가지고 .NET에서 동등하지는 않습니다. 서로 다른 값을 가진 두 인스턴스가 아니라 동일한 인스턴스가되어야합니다. 귀하의 코멘트 다음

편집 :

var query = _dbContext.Orders 
           .ToList() 
           // Group them by what you want to "distint" on 
           .GroupBy(item=>item.ShipCity) 
           // For each of those groups grab the first item, we just faked a distinct) 
           .Select(item=>item.First()) 
           .Select(x => new SelectListItem 
           { 
            Text = x.OrderID.ToString(), 
            Value = x.ShipCity 
           }) 
           .OrderBy(y => y.Value) 
           .Distinct(); 
+0

안녕하세요, Ronan 제 코드를 'Distinct()'로 업데이트했고 위에서 언급 한 것처럼 코드에서 삭제했습니다. 기본적으로 나는 다른 ID에서 동일한 값을 공유 언급 한 바와 같이 db에서 모든 별개의 행을 얻으려고합니다. 이 쿼리와 같은 것'SELECT distinct [ShipCity] FROM [northwind]. [dbo]. [Orders] by ShipCity' 더 명확 해지기를 바래요? – Kevin

+0

@Kevin 네,하지만 linq을 사용하여 내장 된 작업을 수행 할 수는 없지만, 전체 객체 (또는 DB 측의 행)가 아닌 필드로 구별되는 "DistinctBy"가 없습니다. 그러나 groupby를 사용하여 속임수를 쓸 수 있습니다. 지금 내 답변을 편집 해주세요. –

+0

감사합니다. @Ronan 설명. 그게 문제를 해결 :) – Kevin