添加联接时出现实体框架核心错误

时间:2021-05-06 12:14:07

标签: c# entity-framework .net-core

这是如何工作的:

var query = _context.Routing_Tool
            .Where(rt => rt.Id == id)
            .FirstOrDefault();

return query;

但这没有

var query = _context.Routing_Tool                       
     .Join(_context.Routing_Tool_Prioritization_Matrix,
      rt => rt.Id,
      rp => rp.RoutingToolId,
      (rt, rp) => new 
             { 
               Id = rt.Id,
               Title = rt.Title,
               LoeName = rp.LoeName,
              }
        )
         .Where(rt => rt.Id == id)
         .FirstOrDefault();

 return query;

相反,在尝试加入表后,我得到并隐式转换类型错误。感谢帮助

全新的方法 - 包括我正在研究的旧方法以供参考。

public Routing_Tool GetItemsInitById(int id)
        {


            //var query = (from rt in _context.Set<Routing_Tool>()
            //              join rp in _context.Set<Routing_Tool_Prioritization_Matrix>()
            //                  on rt.Id equals rp.RoutingToolId into grouping

            //             from rp in grouping.DefaultIfEmpty()
            //             select new Routing_Tool { 
            //                 Id = rt.Id,
            //                 Title = rt.Title,
            //                 Classification = rt.Classification,
            //                 MainPOC = rt.MainPOC,
            //                 RequestingDirectorate = rt.RequestingDirectorate,
            //                 IsEnduring = rt.IsEnduring,
            //                 IsApproved = rt.IsApproved,
            //                 IsAssociated = rt.IsAssociated,
            //                 DirectingRequirement = rt.DirectingRequirement,
            //                 RequirementDescription = rt.RequirementDescription,
            //                 RequestType = rt.RequestType,
            //                // LoeName = rp.LoeName,
            //                // LoePriority = rp.LoePriority,
            //             }

            //             ).FirstOrDefault();

            // return query;
            var query = _context.Routing_Tool
                         .Join(_context.Routing_Tool_Prioritization_Matrix,
                                    rt => rt.Id,
                                    rp => rp.RoutingToolId,
                                    (rt, rp) => new
                                    { 
                                        Id = rt.Id,
                                        Title = rt.Title,
                                        
                                    }
                          )
                         .Where(rt => rt.Id == id)
                         .FirstOrDefault();

            return query;

        

            //return _context.Routing_Tool.FirstOrDefault(p => p.Id == id);
        }

2 个答案:

答案 0 :(得分:1)

在第一种情况下,您的查询变量是 IQueryable 类型,这是正确的,您返回它,一切都很好。 在第二种情况下,您返回匿名类型,这里有两个选项:

  1. 为该类型创建一个模型(具有 Id、Title 和 LoeName 属性)并返回“IQueryable< MyType >”
  2. 从表达式((rt, rp) => rt)中返回“Routing_Tool”,没有意义

答案 1 :(得分:0)

我不得不通过添加一个集合、一个新的公共方法、一个新的选择查询来修改两个表的模型:

 public Routing_Tool GetItemsInitById(int id)
        {
            var initPage = _context.Routing_Tool
                .Include(pub => pub.Routing_Tool_Prioritization_Matrices)
                .Where(rt => rt.Id == id)
                .FirstOrDefault();

            return initPage;
        }

路由工具模型:

public class Routing_Tool
    {
        public Routing_Tool()
        {
            Routing_Tool_Prioritization_Matrices = new HashSet<Routing_Tool_Prioritization_Matrix>();
        }

        [Key]
        [Required]
        public int Id { get; set; }

        [MaxLength(255)]
        [Required]
        public string Title { get; set; }

        [MaxLength(255)]
        [Required]
        public string Classification { get; set; }

        [MaxLength(255)]
        [Required]
        public string MainPOC { get; set; }

        [MaxLength(10)]
        [Required]
        public string RequestingDirectorate { get; set; }

        [MaxLength(1)]
        [Required]
        public int IsEnduring { get; set; }

        [MaxLength(1)]
        [Required]
        public int IsApproved { get; set; }

        [MaxLength(1)]
        [Required]
        public int IsAssociated { get; set; }

        [Required]
        public string DirectingRequirement { get; set; }

        [Required]
        public string RequirementDescription { get; set; }
        
        [Required]
        public string RequestType { get; set; }
        public virtual ICollection<Routing_Tool_Prioritization_Matrix> Routing_Tool_Prioritization_Matrices { get; set; }

    }

带有 FK 的尺寸表:

public class Routing_Tool_Prioritization_Matrix
    {
        [Key]
        [Required]
        public int Id { get; set; }
        public string LoeName { get; set; }
        public string LoePriority { get; set; }
        public int RoutingToolId { get; set; }
        [ForeignKey("RoutingToolId")]
        public virtual Routing_Tool Routing_Tool { get; set; }
    }