EDMX使用ICollection作为此关系的1:n关系
public partial class Customer
{
...
public virtual ICollection<User> Users { get; set; }
ICollection实现IEnumerable而不是IQueryable,因此使用客户的属性导航按站点过滤,从DB服务器检索所有记录并在客户端过滤它们(这是一个不是真实案例的例子):
var users = myContext.Customer.Users.Where(u.Enabled).FirstOrDefault();
Linq查询:
SELECT [Extent1].[IdCustomer] AS [IdCustomer],
[Extent1].[Enabled] AS [Enabled],
...
FROM [Framework].[User] AS [Extent1]
我试图“强制”EF在运行时将用户设置为可查询但不起作用:
var users = myContext.Customer.Users.AsQueryable().Where(u.Enabled).FirstOrDefault();
关于这个问题的两个问题:
答案 0 :(得分:1)
“如此使用客户的属性导航按网站过滤,从数据库服务器检索所有记录并在客户端过滤它们”
这个假设是你出错的地方。 Where()
返回谓词,实体框架在实现时将其转换为SQL查询。
启用延迟加载后,实体框架将覆盖虚拟属性并对其执行魔术以启用延迟加载。