gpt4 book ai didi

c# - 编写扩展方法来帮助查询多对多关系

转载 作者:可可西里 更新时间:2023-11-01 08:28:44 26 4
gpt4 key购买 nike

我正在尝试编写一个扩展方法,以重构我正在编写的 linq 多对多查询。我正在尝试检索 Post(s) 的集合,这些集合在作为参数传递给我的方法的集合中标记有任何 Tag(s)

以下是相关实体及其一些属性:

Post

Scalar Properties: PostID, PostDate

Navigation Property: PostTags

PostTag

Scalar Properties: PostTagID, PostID, TagID

Navigation Properties: Post, Tag

Tag

Scalar Properties: TagID

Navigation Property: PostTags

这是我目前正在使用的查询,效果很好:

public IEnumerable<Post> GetPostsByTags(IEnumerable<Tag> tags)
{
return from pt in context.PostTags
from t in tags
where pt.TagID == t.TagID &&
pt.Post.PostDate != null
orderby pt.Post.PostDate descending
select pt.Post;
}

这是我努力创建的扩展方法的(可能不正确的)开头:

public static IEnumerable<TResult> SelectRange<TSource, TResult>(
this IEnumerable<TSource> collection,
Func<IEnumerable<TSource>, IEnumerable<TResult>> selector)
{
return selector(collection);
}

以及原始查询的理想简化:

public IEnumerable<Post> GetPostsByTags(IEnumerable<Tag> tags)
{
return from p in context.Posts
where p.PostTags.SelectRange(x => ?) &&
p.PostDate != null
orderby p.PostDate descending
select p;
}

对于编写此扩展方法 或执行此查询的任何其他更有效方式的任何帮助,我们将不胜感激。

最佳答案

我认为您的原始查询没问题,您只需要处理重复的帖子即可。在末尾添加一个不同的。或者您可以像这样使用 Any 方法。

public IEnumerable<Post> GetPostsByTags(IEnumerable<Tag> tags)
{
return from p in context.Posts
where p.PostTags.Any(pt => tags.Any(t => t.TagID == pt.TagID)) &&
p.PostDate != null
orderby p.PostDate descending
select p;
}

编辑 - 添加了另一个 Any 语句

关于c# - 编写扩展方法来帮助查询多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6355584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com