【问题标题】:EDMX ICollection vs DBSetEDMX ICollection 与 DBSet
【发布时间】:2015-02-03 10:00:23
【问题描述】:

EDMX 将 ICollection 用于像这样的 1:n 关系

public partial class Customer
{
   ...
   public virtual ICollection<User> Users { get; set; }

ICollection 实现 IEnumerable 而不是 IQueryable,因此使用客户上的属性导航来按站点过滤,从数据库服务器检索所有记录并在客户端过滤它们(这是一个示例,不是真实案例):

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();

关于这个问题的两个问题:

  • 为什么 AsQueryable 在这种情况下不起作用?
  • 为什么 EDMX 使用 ICollection 而不是 DbSet?
  • 是否可以使用带有 IQueryable 实现的 DbSet 或专用集合?

【问题讨论】:

    标签: c# linq entity-framework iqueryable


    【解决方案1】:

    所以在客户上使用属性导航按站点过滤,从数据库服务器检索所有记录并在客户端过滤它们”

    这个假设是你出错的地方。 Where() 返回一个谓词,实体框架在具体化时将其转换为 SQL 查询。

    启用延迟加载后,Entity Framework 将覆盖虚拟属性并对其施展魔法以启用延迟加载。

    【讨论】:

    • 很抱歉,我不明白您的回复...在我的示例中,linq 生成的查询不包含 where 子句。
    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 2019-04-23
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多