如何使 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
我有两个 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