有两个模型,Case
和Client
:
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和名称。
我是从错误的角度接近这个,还是建议纠正这个问题?
答案 0 :(得分:0)
如果您使用Distinct()
之类的内容
if (status != "all")
{
query = query.Where(c => c.Status == status).Distinct();
}
答案 1 :(得分: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();
答案 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
和处理以获得唯一客户端。
通常,最好通过最终要返回的数据启动查询,并从该实体构建谓词。