如何使 LINQ 到多个表

How to make LINQ to multiple tables

我有两个 EF 实体:Client 和 Benefit。 (在数据库中,它们在中介 table: "ClientsBenefits" 中连接,如果它很重要),我在中介 class "ClientIndexData" 中连接它们,正如 [=29] 上的建议=] 指南。

你能告诉我如何使用 LINQ 搜索没有好处的客户吗?

我知道,如何使用 SQL 来做到这一点,但我对 LINQ 的特定语法感到非常惊讶,我不能做比随意更复杂的事情。Where (i => i.Name == null) :( 我正在尝试那样做:

clients.Clients = clients.Clients.Where(i => i.Benefits == null)

其中客户变量是:

var clients = new ClientIndexData();
clients.Clients = db.Clients
            .Include(i => i.Schedules.Select(c => c.FintessArea))
            .Include(i => i.Paids)
            .Include(i => i.Benefits)
            .Include(i => i.Tickets);
if (benefitId != null)
        {
            ViewBag.BenefitId = benefitId.Value;
            clients.Benefits = clients.Clients.Where(
                i => i.СlientIdentificator == id.Value).Single().Benefits;
        }
         ....

而 ClientIndexData class 是:

public class ClientIndexData
{
    public IEnumerable<Client> Clients { get; set; }
    public IEnumerable<Benefit> Benefits { get; set; }
    public IEnumerable<Ticket> Tickets { get; set; }
    public IEnumerable<Paid> Paids { get; set; }
    public IEnumerable<Schedule> Schedules { get; set; }

}

如果您建议我如何使用 LINQ 为每个客户(使用 groupBy 和计数)计算福利(或门票),我也会真的感谢您。

对于 LINQ ORM,您通常会尝试避免连接并直接使用导航属性。你写它就像对象在内存中并通过常规对象引用和集合连接:

clients.Clients.Where(i => !i.Benefits.Any())

或者,在 SQL 服务器上效果不佳且速度较慢:

clients.Clients.Where(i => i.Benefits.Count() == 0)

请注意,LINQ to database 查询看起来非常像普通的 LINQ to object 查询。在这两种情况下,这项技能都会对您有所帮助。

您的福利永远不会为空,如果客户没有福利,福利计数将为 0 计算您的福利

clients.Clients.Select(i => i.Benfits.Count());

请注意,您可以select一个复杂的对象,例如

public class BenefitsCount
{
    public int ClientId { get; set; }
    public int BenefitsCount { get; set; }
}

clients.Clients.Select(i => new BenefitsCount {
     ClientId = i.ClientId,
     BenefitsCount = i.Benfits.Count()
});

这将 return 一个 IEnumerable