2016-07-10 2 views
0

두 가지 모델, CaseClient 유무 :LINQ (방법) 반환 여러 레코드

나는 고객 ID의 이름의 목록을 검색 할 수 있도록 나는 현재 이러한 구조를 조회하려면 다음 LINQ 메서드 호출을 사용하고
public class Case 
{ 
    public int Id { get; set; } 
    public string CaseNumber { get; set; } 
    public string Caption { get; set; } 
    public int ClientId { get; set; } 
    public Client Client { get; set; } 
    public string Status { get; set; } 
} 

public class Client 
{ 
    public int Id { get; set; } 
    public string LastName { get; set; } 
    public string FirstName { get; set; } 
    public string PrimaryPhone { get; set; } 
    public string Email { get; set; } 
} 

그와 관련된 어떤 경우의 상태에 따라

public ActionResult Index(string status) 
    { 
     var query = _context.Cases 
      .Include(c => c.Client); 
     if (status != "all") 
     { 
      query = query.Where(c => c.Status == status); 
     } 

     var cases = query.ToList(); 

     return View(cases); 
    } 

내 문제는 내가 같은 클라이언트에 대해 여러 가지 경우가 있다면, 그것은 그 ID와 이름을 여러 번 검색하는 것입니다.

잘못된 각도에서이 문제에 접근하고 있습니까? 아니면이 문제를 해결하기 위해 무엇을 제안합니까?

답변

0

당신이

if (status != "all") 
    { 
     query = query.Where(c => c.Status == status).Distinct(); 
    } 
+0

그러면 상태가 대소 문자가있는 첫 번째 클라이언트 만 당겨집니다. 그것의 사례 .Client.Id 그것은 구별해야합니다. –

0

같은 Distinct()를 사용하는 경우가 anonymus 유형에 IdName을 사용할 수있는 당신은 this question에서 같은 anonymus 유형을 사용 GROUPBY를 여러 속성을 사용할 수있는 것. 쿼리의 끝에서 당신은 추가 할 수 있습니다 : 나는 고유() 메서드를 호출 한 후 var cases = query.ToList();에 선택을 추가하여 내 문제를 해결 .GroupBy(x => new { x.Id, x.Name })

var cases = query.ToList().GroupBy(x => new { x.Id, x.Name }).Select(y => y.First()).ToList(); 
+0

이것은 나를 위해 작동하는 것 같습니다. 나는'cases' 객체를 디버그 모드로 볼 수 있으며 데이터가 정확한 것 같습니다. 제가 맞다면, 내 View의 @model 문은'System.Collections.Generic.List > '이어야합니다. 'Generic List 을 사용하려면 1 개의 타입 인자가 필요하고'제네릭 타입 IGrouping 을 사용하려면 2 개의 타입 인자가 필요하다 '. 내 성명서에있는 것이 아닌가? –

+0

안녕하세요 @KeithClark 마지막 선택 절을 잊어 버렸습니다. 지금 사용해보세요. – meJustAndrew

0

. 단지 잘못된 장소에서, 올바른 개념을했지만, 그것은 옳은 길을 저를 아래로 지적 -

var cases = query.Select(c => c.Client).ToList().Distinct().ToList(); 

가 @Rahul이 : 같은

그래서 내 마지막 코드 보인다. 감사!

@meJustAndrew - 접근 방식이 마음에 들었지만 @model 문에 여전히 매달렸습니다. 내가 잘못한 곳에 의견을 추가 할 수 있다면 좋을 것입니다. 감사!

0

당신이 쿼리가 더 경제적 할 수 속성을 CasesClient에 추가하는 경우 :

public ActionResult Index(string status) 
{ 
    IQueryable<Client> query = _context.Clients; 
    if (status != "all") 
    { 
     query = query.Where(c => c.Cases.Any(cs => cs.Status == status)); 
    } 

    var clients = query.ToList(); 
    // or query.Select(c => new { c.Id, c.Name }) ? 

    return View(clients); 
} 

이 고유 클라이언트를 얻기 위해 상대적으로 비싼 Include 처리를 피할 수 있습니다.

일반적으로 마지막에 반환하려는 데이터로 쿼리를 시작하고 해당 엔터티의 조건자를 빌드하는 것이 좋습니다.