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
答案 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)
有两种方法可以过滤包含实体。
免责声明:我是该项目的所有者Entity Framework Plus ( EF + Query IncludeFilter允许轻松过滤包含的实体。它适用于EF6.x
return context.Tables
.IncludeFilter(x => x.Availibilities .Where(c => c.Available == 1))
.ToList();
在引擎盖下,图书馆完全是一个投影。
一个限制是全部Include
,但现在即使未指定过滤器(例如帐户),也会使用IncludeFilter
进行调用。