实体框架条件包含()

时间:2018-04-07 23:20:34

标签: entity-framework

public partial class Table
{   
    public int TableId { get; set; }
    public Nullable<int> Num { get; set; }
    public int NbSeats { get; set; }
    public Nullable<int> R_LocationId { get; set; }
    public virtual ICollection<Availibility> Availibilities { get; set; }
    public virtual R_Locations R_Locations { get; set; }
}

public partial class Availibility
{
    public System.DateTime DayRes { get; set; }
    public Nullable<bool> Available { get; set; }
    public int TableId { get; set; }
    public virtual Table Table { get; set; }
}

我想用实体框架实现这个请求:

select * 
from Tables join Availibilities 
    on Availibilities.TableId = Tables.TableId 
where Availibilities.Available=1

2 个答案:

答案 0 :(得分:0)

从数据库获取数据的一个较慢的部分是将数据从DBMS传输到本地进程。因此,您不应该传输比实际计划使用的更多的值。

您的Table有零个或多个Availabilities。您的数据库通过为Availability表提供其所属的Table的外键来实现此目的。

因此,如果您有一张包含Id 4的表格,其中包含100 Availabilities,您可以使用Table和{{1}查询Availabilities及其Join你会将外键的Availability.TableId传输100次,而你已经知道它们都将具有Include的值。你甚至知道这个值,因为你要求表ID为Id。

因此,除非您计划更新检索的值,否则请始终使用Select而不是查询完整的类。

回到你的问题

给定tableId,您需要该表的信息以及(部分或全部)其可用性。

感谢实体框架,您不必使用Table.Id。如果您使用集合,实体框架将为您进行连接。

Join

实体框架知道需要哪个加入。使用Collections而不是Join的一个更好的方法是让你的数据库更抽象:你真的想到的var tableWithAvailabilities = myDbContext.Tables .Where(table => table.TableId == tableId) .Select(table => new { // select only the properties you plan to use Id = table.TableId, Num = table.Num, ... Availabilities = table.Availabilities .Where(availability => ...) // if you don't want all Availabilities .Select(availability => new { // again: select only the properties you plan to use // not needed, you know it equals Table.TableId // Id = availability.TableId, Date = availability.DayRes, Available = availability.Avialable, }) .ToList(), }); 有零或更多Table。缺少DBMS需要两个表来实现它。如果您的内部表更改,例如外键的名称,您的查询不会更改,因为您不使用外键

如果您不打算更新获取的值,则很难获取

答案 1 :(得分:0)

有两种方法可以过滤包含实体。

  • 使用投影(参见@Harald答案)
  • 使用第三方库

免责声明:我是该项目的所有者Entity Framework Plus ( EF + Query IncludeFilter允许轻松过滤包含的实体。它适用于EF6.x

return context.Tables
                .IncludeFilter(x => x.Availibilities .Where(c => c.Available == 1))
                .ToList();

在引擎盖下,图书馆完全是一个投影。

一个限制是全部Include,但现在即使未指定过滤器(例如帐户),也会使用IncludeFilter进行调用。

维基:EF+ Query Include Filter