EF代码首先根据多对多关系选择行

时间:2011-12-30 17:36:03

标签: linq ef-code-first

我的存储库中有以下代码:

public PagedResult<Post> GetAllPublishedByTag(int tagId, int start, int max)
{
    var query = Database.Set<Post>().Where(p => p.IsPublished)
                                    .OrderByDescending(p => p.CreatedAt)
                                    .Skip(start)
                                    .Take(max);

    int total = query.Count();
    var result = query.ToList();

    return new PagedResult<Post>(result, total);
}

这将给我所有发表的帖子。但我想要的是为某个标签选择所有已发布的帖子。我的模型设置方式使得标签与帖子有多对多的关系。我尝试稍微修改上面的代码,但这不起作用:

public PagedResult<Post> GetAllPublishedByTag(Tag tag, int start, int max)
{
    var query = Database.Set<Post>().Where(p => p.Tags.Contains(tag) && p.IsPublished)
                                    .OrderByDescending(p => p.CreatedAt)
                                    .Skip(start)
                                    .Take(max);

    int total = query.Count();
    var result = query.ToList();

    return new PagedResult<Post>(result, total);
}

我更倾向于传入tagId(根据第一个代码示例)而不是标记对象,但不确定如何正确编写LINQ语句。

1 个答案:

答案 0 :(得分:1)

var query = Database.Set<Post>().Where(p => p.Tags.Any(t => t.Id == tagId) && p.IsPublished)
.OrderByDescending(p => p.CreatedAt)
.Skip(start)
.Take(max);

旁注:我相信您的分页可能有问题,因为调用skip / take后计算变量total。