首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架-如何过滤急切加载的导航/关系属性?

实体框架-如何过滤急切加载的导航/关系属性?
EN

Stack Overflow用户
提问于 2011-06-23 09:53:54
回答 2查看 863关注 0票数 4

我有以下实体框架4.1实体和关系

Concert ConcertId,AdministratorUserId,Name,IsDeleted

订票 BookingId,ConcertId,UserId,IsDeleted

UserId,UserId,Name,IsDeleted

Relationship音乐会1.M预订1.1用户

现在,我试图选择所有的音乐会为一个特定的AdminstratorUserId,但也包括所有的预订,每次音乐会和用户的详细信息,为每次预订。我也想应用一个过滤器,其中IsDeleted ==为每个音乐会,预订和用户的假。我想交还一份音乐会的名单,这些音乐会的预订和用户详细资料被保留为导航属性。

在SQL中,这就是我试图实现的目标:

代码语言:javascript
复制
SELECT *
FROM concert c, booking b, user u
WHERE c.ConcertId = b.ConcertId AND b.UserId = u.UserId AND c.AdministratorId = 10
AND c.IsDeleted = false AND b.IsDeleted = false AND u.IsDeleted = false

据我所知,使用"Include“方法来急切加载,不允许对加载的子实体进行过滤或子查询;它返回该联接的所有记录,因此我尝试使用匿名投影,如下所示:

代码语言:javascript
复制
int adminId = 10;

var concerts = _context.Concerts
    .Where(p => p.AdministratorId == adminId && p.IsDeleted == false)
    .Select(p => new {
        Concerts = p,
        Bookings = p.Bookings
            .Where(q => q.IsDeleted == false && q.User.IsDeleted == false)
            .Select(r => new {
                Bookings = r,
                User = r.User
            })
            .AsEnumerable()
            .Select(q => q.Bookings)
    })
    .AsEnumerable()
    .Select(p => p.Concerts)
    .ToList();

但是,这仍然是返回所有记录,而不是过滤出IsDeleted = true的记录。有人有什么想法,或建议,我如何才能清理这个可怕的问题?

我还尝试过类似于此的方法(http://blogs.msdn.com/b/alexj/archive/2009/06/02/tip-22-how-to-make-include-really-include.aspx),它再次失败(返回所有预订,甚至删除的预订):

代码语言:javascript
复制
var concertsQuery = (ObjectQuery<Concert>)_context.Concerts
    .Where(p => p.UserId == userId
        && p.IsDeleted == false
        && p.Bookings.Any(q => q.IsDeleted == false && q.User.IsDeleted == false)
    );

var concerts = concertsQuery.Include("Bookings").Include("Bookings.User").ToList();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-28 17:48:14

因此,我设法解决这个问题的方法是按照Ladislav的答案运行LINQ查询,然后使用匿名对象将各个对象重新附加到它们正确的关系属性,如下所示:

代码语言:javascript
复制
var concertResult = new List<Concert>();

foreach (var concertObject in concerts)
{
    var concert = concertObject.Concert;

    foreach (var bookingObject in concertObject.Bookings)
    {
        var booking = bookingObject.Booking;
        booking.User = bookingObject.User;
        concert.Bookings.Add(booking);
    }
    concertResult.Add(concert);
}
票数 1
EN

Stack Overflow用户

发布于 2011-06-23 11:04:49

去掉那些AsEnumerable,它们会将您的查询转到linq到对象:

代码语言:javascript
复制
var concerts = _context.Concerts
    .Where(p => p.AdministratorId == adminId && p.IsDeleted == false)
    .Select(p => new {
        Concerts = p,
        Bookings = p.Bookings
            .Where(q => q.IsDeleted == false && q.User.IsDeleted == false)
            .Select(r => new {
                Bookings = r,
                User = r.User
            })
    })
    .ToList();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6452224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档