如何在实体框架 ASP > NET 中获取给定列表中具有所有 id 的所有实体

Posted

技术标签:

【中文标题】如何在实体框架 ASP > NET 中获取给定列表中具有所有 id 的所有实体【英文标题】:How to get all entities with all ids on given list in Enity Framework ASP>NET 【发布时间】:2021-10-17 12:44:36 【问题描述】:

我有问题。 我有两张与“一个”到“很多”相关的表格。 我有一个列表,它是“许多”一侧表中项目的子集。 我想从“一个”一侧的表格中获取与“许多”一侧的所有元素有关系的元素。 我尝试了类似的东西

public async Task<GetQuestionsDTO> GetQuestions(int skip, SortOptionEnum sortOption,
        List<int> tags)
    
        IQueryable<Question> QuestionQuery = _context.Questions.AsQueryable();
        int count;
        if (tags.Count != 0)
        
            QuestionQuery = QuestionQuery
                .Where(question => _context.QuestionTags
                    .Where(tag=>tag.IdQuestion == question.IdQuestion)
                    .Select(tag=> tag.IdTag)
                    .ToList()
                    .Intersect(tags)
                    .Equals(tags)
                );
        
        count = await QuestionQuery.CountAsync();
        switch (sortOption)
        
            case SortOptionEnum.Views:
                QuestionQuery = QuestionQuery.OrderBy(question => question.Views);
                break;
            case SortOptionEnum.Answers:
                QuestionQuery = QuestionQuery.OrderBy(question => question.Answers.Count);
                break;
            case SortOptionEnum.Date:
                QuestionQuery = QuestionQuery.OrderByDescending(question => question.PublishDate);
                break;
        

        QuestionQuery = QuestionQuery.Skip(_skip).Take(_takeAmount);
        return new GetQuestionsDTO()
        
            StandardQuestions = await QuestionQuery.Select(question => new QuestionGetQuestionsDTO()
            
                IdQuestion = question.IdQuestion,
                AnswersCount = question.Answers.Count,
                Avatar = question.IdUserNavigation.Avatar,
                Tags = question.QuestionTags.Select(qt => qt.IdTagNavigation.Name).ToList(),
                Description = question.Description,
                Header = question.Header,
                IdUser = question.IdUser,
                IsFinished = question.IsFinished,
                IsModified = question.IsModified,
                Nickname = question.IdUserNavigation.Nickname,
                Views = question.Views,
                PublishDate = question.PublishDate
            ).ToListAsync(),
            QuestionsCount = count
        ;
    

但我明白了

System.ArgumentException: Expression of type 'System.Collections.Generic.List ``1[System.Int32]' cannot be used for parameter of type 'System.Linq.IQueryable``1[System.Int32]' of method 'System.Linq.IQueryable``1[System.Int32] Intersect[Int32](System.Linq.IQueryable``1[System.Int32], System.Collections.Generic.IEnumerable``1[System.Int32])' (Parameter 'arg0')

有什么方法可以使用 EntityFramework 或者我应该在数据库中使用存储过程吗?

【问题讨论】:

您的查询看起来比我想象的要复杂。要确认......你有一个一对多的问题表链接到 questiontags 表。您的方法的 tags 数组是与问题标签表上的 tagid 匹配的标签 ID 列表? 是的,没错 【参考方案1】:

我认为这会奏效。 questiontags tagid 在 tagids 数组中的问题。

IQueryable<Question> questions = context.Questions;

foreach(int tagid in tagsid)
  
questions = questions.Where(w=> w.QuestionTags.Select(s=> s.TagId).Contains(tagid));


以这种方式构建查询意味着问题必须至少具有参数中指定的所有标签。

如果您的参数的 id 为 1、2、3,那么查询就很重要了。 Question 必须有 Questiontag 有 1,然后 Question 必须有 questiontag 包含 etc

【讨论】:

我在移动设备上,所以无法确认语法。此外,这假设您在对象之间具有导航属性。 这不起作用:/。不是第二个返回一组问题标签吗?是的,我在对象之间有导航属性。 当你说不起作用时,它有什么作用?第二个 Where 不返回数据,您仍然会遇到问题。你只是得到了相关问题标签在数组中具有 ID 的问题。 I get an error: CS0029 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable&lt;Models.QuestionTag&gt;' to 'bool' 并且程序不会编译 我会更新:将第二个位置更改为任何。应该工作

以上是关于如何在实体框架 ASP > NET 中获取给定列表中具有所有 id 的所有实体的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的实体框架和 ASP.NET MVC 项目中重构 connectionString?

如何在 Asp.Net 5 (MVC 6) 中使用实体框架 6.x

如何在使用实体框架时获取所有用户角色

如何使用代码优先实体框架在 ASP.Net MVC3 中重新加载多对多导航属性

如何在 Asp.net MVC 和实体框架中分页时应用过滤器?

如何使用trackerenableddbcontext在asp.net mvc5和代码中的实体框架中实现审计跟踪