2016-07-10 7 views
0

Есть две модели, Case и Client: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; } 
} 

настоящее время я использую следующий LINQ вызова метода для запроса эти структуры, так что я могу получить список Идентификатор клиента и имя-х на основе статуса любого случая, связанного с ними

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); 
    } 

Моя проблема заключается в том, что если у меня есть несколько случаев для того же клиента, он получает, что идентификатор и имя несколько раз.

Я подхожу к этому с неправильного угла или что предлагается исправить эту проблему?

ответ

0

Что делать, если вы используете Distinct() как

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

Это приведет только к первому клиенту, имеющему случай с состоянием. Его Case.Client.Id, который должен быть отличным –

0

Вы можете использовать GroupBy несколько свойств, используя тип Анонимус как в this question, где вы можете использовать Id и Name в типе Анонимус. В конце запроса Вы можете добавить: .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' в режиме отладки, и данные кажутся правильными. Если я прав, оператор @model в моем представлении должен быть 'System.Collections.Generic.List >', но я получаю после двух ошибок: 'Использование общего списка требует 1 тип аргументов' и' Использование группового типа IGrouping требует 2 аргумента типа. Разве это не то, что я имею в своем заявлении? –

+0

Привет @KeithClark Я забыл последнее предложение select, вы можете попробовать сейчас – meJustAndrew

0

я решил мою проблему, добавив запись в var cases = query.ToList();, а затем вызвать метод Distinct().

Так что мой окончательный код выглядит следующим образом:

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

@Rahul - Если бы правильное понятие, как раз в том месте, но он указал мне вниз правильный путь. Благодаря!

@meJustAndrew - Мне понравился подход, но он все еще повесился в заявлении @model. Если вы можете добавить какие-либо комментарии о том, где я ошибся, это было бы здорово. Благодаря!

0

Если Вы добавляете свойство Cases к Client вы можете сделать запрос более экономичен:

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 и обработки, чтобы получить уникальный клиент.

Как правило, обычно лучше начать запрос данными, которые вы хотите вернуть в конце, и построить предикаты от этого объекта.

Смежные вопросы