繁体   English   中英

LINQ To实体包括+ Where方法

[英]LINQ To Entities Include + Where Method

我有NxN表,想象一下:

用户(id,...)< - UserAddresses(id,userId,addressId,enabled,...) - >地址(id,...)

UserAddresses包含用户和地址的FK。 据我所知,实体框架用户创建的实体包含UserAddresses的集合。 地址包含UserAddresses的集合,特定的UserAddress包含对User和一个Address的重新发送。

现在我想通过linq进行下一个查询。 对于特定用户标识,仅获取已启用标志设置为true的userAddresses。 对于特定用户标识,userAddresses可以包含多个条目,但只为此特定用户设置了一个条目。

我能做的查询是:

context.User.Include( x => x.UserAddresses )
            .Include( x => x.UserAddresses.Select(y => y.Address) )
            .Single( x => x.id == USER_ID )

但我真正想要的是不为该用户加载所有UserAddresses ...只包含启用的那个,设置为TRUE!

有人可以帮我做这个查询吗?

EF中没有办法部分加载关联属性。 尝试选择匿名类型,只选择您需要的内容:

var result = context.User
   .Where(u => u.Id == userId)
   .Select(u => new {
       Addresses = u.UserAddresses.Select(ua => ua.Address)
            .Where(a => a.Enabled),
       User = u // if you need this as well 
   })
   .Single();

这不会加载result.User.UserAddresses,但result.Addresses将具有您想要的。

如果您确实想要将所有内容作为User类的一部分返回,则需要分离result.User,然后更新result.User.UserAddresses以指向result.Addresses。

另一种选择是使用Load()而不是Include()

var foundUser = context.User.Single(x => x.Id == USER_ID);

context.Entry(foundUser).Collection(u =>
u.UserAddresses).Query().Where(userAddress =>
userAddress.Enabled).Load();

请记住,在某些情况下,EF可以忽略Load()方法:

  1. 如果您使用EF和延迟加载功能,则获取对象会带来所有已在类中标记为Virtual的关联集合。 所以通过context.User.Single( x => x.id == USER_ID ); 您将获得与用户关联的所有UserAddresses,除非您通过从User类中的属性中删除Virtual关键字来关闭您的集合的延迟加载。

  2. 如果要在程序中添加/删除UserAddresses集合,则调用context.SaveChanges(); 在不处理上下文的情况下,下次加载User对象时,将从EF上下文缓存中加载UserAddresses集合,而不是从DB(最新更改)加载。 在这种情况下,您需要在从上下文获取User之前设置上下文并实例化新上下文。 例如,如果您的用户在UserAddresses集合中有5个项目,并且您禁用其中一个项目( item.Enabled = false ),然后调用context.SaveChanges()而不处理您的上下文,下次获取User对象时在相同的上下文中,它的集合中已经有5个项目来自上下文缓存,它忽略了你的Load()方法。

PS:

如果应用以下所有条件,则延迟加载功能为ON:

  1. context.Configuration.LazyLoadingEnabled = true;
  2. context.Configuration.ProxyCreationEnabled = true;
  3. UserAddresses已在User类中定义为Virtual。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM