无需 LoadOptions 的预加载/预取多对多 - Linq to Sql

发布于 2024-08-15 10:57:34 字数 648 浏览 11 评论 0 原文

我遇到了一种情况,我需要通过多对多关系预取一些实体。所以它就像经典的 BlogPost <- BlogPostTag ->标记情况。

是的,我知道 LoadOptions,但我无法使用它,因为它是一个 Web 应用程序,而且我正在使用每个请求一个数据上下文的模式。

您似乎也无法使用投影来预取多对多关系。是的?不?

我想根据一组博客返回 IQueryable 。我能做的最好的事情就是通过执行以下操作让它返回 IQueryable>

public IQueryable<Tag> GetJobsCategories(IQueryable<BlogPost> blogPosts)
{
    var jobCats = from bp in blogPosts
                  select bp.BlogPostTags.Select(x => x.Tag);

    return jobCats;
}

我可以将其展平吗?我错过了一些明显的东西吗?我可以采取另一种方法吗?

不,我无法更改 ORM ;-)

I've got a situation where I need to prefetch some entities through a many-to-many relationship. So it's like the classic BlogPost <- BlogPostTag -> Tag situation.

Yes, I'm aware of LoadOptions but I can't use it because it's a web application and I'm using the one datacontext per request pattern.

It also seems you can't use projection to prefetch many-to-many relationships. Yes? No?

I want to return IQueryable<Tag> based on a set of Blogs. The best I can do is get it to return IQueryable<IEnumerable<Tag>> by doing the following:

public IQueryable<Tag> GetJobsCategories(IQueryable<BlogPost> blogPosts)
{
    var jobCats = from bp in blogPosts
                  select bp.BlogPostTags.Select(x => x.Tag);

    return jobCats;
}

Can I flatten that? Am I missing something obvious? Is there another approach I can take?

And no, I can't change ORMs ;-)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

别忘他 2024-08-22 10:57:34

这将起作用,您可以在 linq 查询中向下钻取

public IQueryable<Tag> GetJobsCategories(IQueryable<BlogPost> blogPosts)
{
    return from bp in blogPosts
           from tag in bp.BlogPostTags
           select tag;
}

如果您这样声明该方法:

public static IQueryable<Tag> GetJobsCategories(this IQueryable<BlogPost> blogPosts)

您可以将其用作可查询的扩展方法。例如

myContext.BlogPosts.GetJobsCategories()

This will work, you can just drill down in the linq query

public IQueryable<Tag> GetJobsCategories(IQueryable<BlogPost> blogPosts)
{
    return from bp in blogPosts
           from tag in bp.BlogPostTags
           select tag;
}

If you declare the method as such:

public static IQueryable<Tag> GetJobsCategories(this IQueryable<BlogPost> blogPosts)

You can use it as extension method on queryables. For instance

myContext.BlogPosts.GetJobsCategories()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文