如何通过 linq 查询 IDBSet

本文关键字:IDBSet 查询 linq 何通过 | 更新日期: 2023-09-27 18:33:20

我有一个表,我正在尝试查询以创建一个菜单。我还在查询相关表以配对结果。我有一个包含我所有数据模型的模型项目。在我的实体文件中,我有

 public IDbSet<Agent> Agents { get; set; }
        public IDbSet<UsersLogin> UsersLogins { get; set; }
        public IDbSet<Role> Roles { get; set; }
        public IDbSet<UserRoleMapping> UserRoleMappings { get; set; }
        public IDbSet<Qualifier> Qualifiers { get; set; }
        public IDbSet<tblMenus> tblMenu { get; set; }
        public IDbSet<tblUserMenuMapping> tblUserMenuMappings { get; set; }
        public IDbSet<tblRoleMenuMapping> tblRoleMenuMappings { get; set; }

在我的界面中,我有ICollection<tblMenus> GetAllMenus();

然后我有我的 linq 查询,它削减了所有内容并返回主菜单和子菜单。

public ICollection<tblMenus> GetAllMenus()
{
    if (Global.CurrentProfile.UserID == 1)
    {
        return DataAccess.tblMenu.Where(m => !m.IsDeleted).ToList();
    }
    else
    {
        var UserInfo = GetUserInfo();
        UserType = UserInfo.First().UserTypeID;

        var childRoleMenus =

            from menus in DataAccess.tblMenu
            join roleMenus in DataAccess.tblRoleMenuMappings on menus.MenuID equals roleMenus.MenuID
            join userRoles in DataAccess.UserRoleMappings on roleMenus.RoleID equals userRoles.RoleID
            where userRoles.UserID == Global.CurrentProfile.UserID && !menus.IsDeleted
            select menus;

        var userChildMenus = 
            from menus in DataAccess.tblMenu
                             join userMenus in DataAccess.tblUserMenuMappings on menus.MenuID equals userMenus.MenuID
                            where userMenus.UserID == Global.CurrentProfile.UserID
                             select menus;
        var childMenus = childRoleMenus.Union(userChildMenus).ToList();

但是,当我在我的页面中执行查询时,它会返回此错误。

指定的类型成员"菜单 ID"在 LINQ to 实体中不受支持。仅支持初始值设定项、实体成员和实体导航属性

这是我的模型。

 public class tblMenus : ModelBase
{
public int MenuID { get; set; }
public string MenuName { get; set; }
public string MenuLink { get; set; }
public Nullable<int> ParentID { get; set; }
public Nullable<bool> IsParent { get; set; }
public string IconImagePath { get; set; }
public Nullable<int> ApplicationID { get; set; }
public int CreatedBy { get; set; }
public System.DateTime CreatedOn { get; set; }
public string UpdatedBy { get; set; }
public Nullable<System.DateTime> UpdatedOn { get; set; }
public bool IsDeleted { get; set; }
public string ProcessedPage { get; set; }
public string MenuTarget { get; set; }
public Nullable<bool> IsEnabled { get; set; }
public string MenuCategory { get; set; }
public int MenuOrder { get; set; }
public virtual ICollection<tblRoleMenuMapping> tblRoleMenuMapping { get; set; }
   public int RoleMenuID { get; set; }
    public int RoleID { get; set; }
    public int MenuID { get; set; }
    public int CreatedBy { get; set; }
    public System.DateTime CreatedOn { get; set; }
    public Nullable<int> UpdatedBy { get; set; }
    public Nullable<System.DateTime> UpdatedOn { get; set; }
    public Nullable<bool> IsDeleted { get; set; }
    public string ProcessedPage { get; set; }
    public string PageAccessibility { get; set; }
    public virtual ICollection<tblMenus> tblMenus { get; set; }
    public virtual ICollection<Role> Role { get; set; }

    public class tblUserMenuMapping : ModelBase
{
    public int UserMenuID { get; set; }
    public int UserID { get; set; }
    public int MenuID { get; set; }
    public Nullable<int> CreatedBy { get; set; }
    public Nullable<System.DateTime> CreatedOn { get; set; }
    public Nullable<int> UpdatedBy { get; set; }
    public Nullable<System.DateTime> UpdatedOn { get; set; }
    public bool IsDeleted { get; set; }

如何通过 linq 查询 IDBSet

如果不看到整个模型类和数据库,很难确定。 要检查的一些事项是:

  1. 验证每个基础表中是否存在每个相应的"菜单 ID"列。 由于不使用映射配置,因此需要确保列名称遵循 EF 预期的命名约定。
  2. 验证两个表之间是否存在外键关系。

从更一般的角度来看,我会考虑使用配置类,以便您的关系是显式的,并且您的模型更容易从它们映射到的表中进行更改。

最后,通过检查 EF 生成的 SQL,您可能会看到一些线索。 将本文中描述的技术用于任何危险信号(例如 EF 正在寻找不存在的列):

var result = from x in appEntities
             where x.id = 32
             select x;
var sql = ((System.Data.Objects.ObjectQuery)result).ToTraceString();