LINQ(方法)返回多条记录

时间:2016-07-10 00:22:49

标签: c# asp.net-mvc linq

有两个模型,CaseClient

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方法调用来查询这些结构,以便我可以根据与其关联的任何Case的状态检索客户端ID和名称的列表

    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和名称。

我是从错误的角度接近这个,还是建议纠正这个问题?

4 个答案:

答案 0 :(得分:0)

如果您使用Distinct()之类的内容

,该怎么办?
    if (status != "all")
    {
        query = query.Where(c => c.Status == status).Distinct();
    }

答案 1 :(得分:0)

您可以使用匿名类型使用GroupBy多个属性,如this question所示,您可以在匿名类型中使用IdName。在查询结束时,您可以添加:.GroupBy(x => new { x.Id, x.Name })

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

答案 2 :(得分:0)

我通过添加选择var cases = query.ToList();然后调用Distinct()方法解决了我的问题。

所以我的最终代码如下:

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

@Rahul - 有正确的概念,只是在错误的地方,但它指出了我正确的道路。谢谢!

@meJustAndrew - 我喜欢这种方法,但仍然挂在了@model语句上。如果你可以在我错误的地方添加任何评论,那就太好了。谢谢!

答案 3 :(得分: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和处理以获得唯一客户端。

通常,最好通过最终要返回的数据启动查询,并从该实体构建谓词。