编写扩展方法以帮助查询多对多关系
||
我试图写一个ѭ0来重构我正在写的linq多对多查询。我正在尝试检索已用参数传递给我的方法的集合中的任何“ 2”标记的“ 1”的集合。
以下是相关的实体及其一些属性:
发布
标量特性:
PostID
,PostDate
导航属性:PostTags
PostTag
标量特性:PostTagID
,PostID
,TagID
导航属性:Post
,Tag
标签
标量性质:TagID
导航属性: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;
}
这是我努力创建的extension method
(可能不正确)的开始:
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;
}
非常感谢您编写此“ 0”的帮助或执行此查询的任何其他更有效的方法。
没有找到相关结果
已邀请:
3 个回复
玩翁文醚碱
编辑-添加了另一个Any语句
亥套惟间连
子句,该子句专门用于这种多对多关系:
它不是以前的选项“更正确”:在发布问题时,您已经可以使用某些功能。但这绝对是在语法和性能方面更巧妙的工作方式。
淘圃跺枯替
它们是相当长的方法,但是它们涵盖了通过中间表将两个表连接在一起以及按任何特定的Left项或left项的属性进行分组 使用它们看起来像这样(如上所述,为了方便阅读,我将每个参数都包装在其自己的行上)
也许它将对您有所帮助,我本人倾向于远离查询语法,所以我几乎只使用Linq的方法语法,因此编写此类扩展方法只是我现在考虑的一种方式。