Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 实体框架-如何筛选已加载的导航/关系属性?_Sql_Linq_Entity Framework_C# 4.0 - Fatal编程技术网

Sql 实体框架-如何筛选已加载的导航/关系属性?

Sql 实体框架-如何筛选已加载的导航/关系属性?,sql,linq,entity-framework,c#-4.0,Sql,Linq,Entity Framework,C# 4.0,我有以下实体框架4.1实体和关系 音乐会音乐会ID、管理员用户ID、姓名已删除 预订 BookingId、ConcertId、UserId、IsDeleted 用户ID,用户ID,名称,已删除 关系 音乐会1…M预订1…1个用户 现在,我正在尝试为特定的AdministratorUserID选择所有音乐会,但也包括每个音乐会的所有预订以及每个预订的用户详细信息。我还想为每个音乐会、预订和用户应用一个过滤器,其中IsDeleted==false。我想返回一份音乐会的列表,这些音乐会的预订和用户详细

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

音乐会音乐会ID、管理员用户ID、姓名已删除

预订 BookingId、ConcertId、UserId、IsDeleted

用户ID,用户ID,名称,已删除

关系 音乐会1…M预订1…1个用户

现在,我正在尝试为特定的AdministratorUserID选择所有音乐会,但也包括每个音乐会的所有预订以及每个预订的用户详细信息。我还想为每个音乐会、预订和用户应用一个过滤器,其中IsDeleted==false。我想返回一份音乐会的列表,这些音乐会的预订和用户详细信息作为导航属性进行维护

在SQL中,我正试图实现以下目标:

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”方法进行加载,不允许对加载的子实体进行筛选或子查询;它返回该联接的所有记录,因此我尝试使用匿名投影,如下所示:

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),再次失败(返回所有预订,甚至是已删除的预订):

var concertsQuery=(ObjectQuery)\u 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();

摆脱那些
可计算的对象
它们会将您的查询转换为linq to对象:

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

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

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);
}
var concertResult=新列表();
foreach(音乐会中的对象)
{
var concert=concertObject.concert;
foreach(concertObject.Bookings中的var bookingObject)
{
var记账=记账对象记账;
booking.User=bookingObject.User;
音乐会。预订。添加(预订);
}
concertResult.Add(concert);
}

不幸的是,我需要返回一个列表,这似乎返回了一个新的匿名类型的列表。是否有方法返回导航属性仍然完整的音乐会列表?如果您希望相关实体有序,则无法返回音乐会列表。执行此查询后,可以尝试将匿名结构转换为音乐会。
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);
}