代码之家  ›  专栏  ›  技术社区  ›  x19

使用Lambda表达式在多对多关系表中实现查询

  •  0
  • x19  · 技术社区  · 12 年前

    根据图片,我设计了3个表,分别是Article、Tag和ArticleTag。 ArticleTag是Article和Tag表之间的关联表。 现在,我想使用Lambda表达式创建一个查询,根据TagId获取文章。

    我使用过实体框架6.x 首先,我通过查询根据tagTitle获得TagId。

    // tagTitle is a parameter that passed to a method.
    // isActiveTag is a parameter that passed to a method.
    int currentTagId = DataContextFactory.GetDataContext()
                .Tags.Where(p => p.Title == tagTitle && p.IsActive == isActiveTag)
                .Select(p => p.Id).SingleOrDefault();
    

    现在我想使用currentTagId获取与之相关的文章。

    如何创建查询 Lambda表达式 根据当前TagId获取文章?

    public class Tag : Entity, ITag
    {
        public string Title { get; set; }
        public string Description { get; set; }
        public bool? IsActive { get; set; }
        public virtual ISet<ArticleTag> ArticleTags { get; set; }
        public virtual ISet<ProjectTag> ProjectTags { get; set; }
    }
    public class Article : Entity, IArticle
    {
        public virtual int? UserMemberShipId { get; set; }
    
        public virtual string Title { get; set; }
    
        public virtual string Summary { get; set; }
    
        public virtual string Description { get; set; }
    
        public virtual decimal? RateCounter { get; set; }
    
        public virtual int? LikeCounter { get; set; }
    
        public virtual bool IsActive { get; set; }
    
        public virtual bool IsActiveNewComment { get; set; }
    
        public virtual ISet<Comment> Comments { get; set; }
    
        public virtual ISet<Rating> Ratings { get; set; }
    
        public virtual ISet<AttachmentFile> AttachmentFiles { get; set; }
    
        public virtual ISet<ArticleTag> ArticleTags { get; set; }
    
        public virtual ISet<ArticleLike> ArticleLikes { get; set; }
    }
    
    public class ArticleTag : Entity, IArticleTag
    {
        public virtual int TagId { get; set; }
        public virtual int ArticleId { get; set; }
        public virtual Article Article { get; set; }
        public virtual Tag Tag { get; set; }
        public virtual int? Extra { get; set; }
    }
    

    enter image description here

    1 回复  |  直到 12 年前
        1
  •  1
  •   Grant Winney    12 年前

    您已经按照所需的标题进行了筛选,因此您应该能够通过其他表的键来连接它们,并选择匹配的“文章”记录。

    试试看: (我当然无法测试,但看看它是否有效)

    var context = DataContextFactory.GetDataContext();
    
    var articles = (from tag in context.Tags
                    join ta in context.ArticleTags on tag.Id equals ta.TagId
                    join article in context.Articles on ta.ArticleId equals article.Id
                    where tag.Title == tagTitle
                       && tag.IsActive == isActiveTag
                    select article).ToList();