如何通过linq查询IDBSet

时间:2016-02-05 15:10:34

标签: c# entity-framework linq

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

 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();

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

指定的类型成员&#39; MenuID&#39; LINQ to Entities不支持。仅支持初始值设定项,实体成员和实体导航属性

这是我的模特。

 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; }

1 个答案:

答案 0 :(得分:1)

如果没有看到整个模型类和数据库,很难肯定地说。有些事情需要检查:

  1. 验证每个基础表中是否存在各自的“MenuID”列。因为您没有使用映射配置,所以需要确保列名遵循命令EF期望。
  2. 验证它们是两个表之间的外键关系。
  3. 从更一般的角度来看,我会考虑使用配置类,以便您的关系是明确的,并且您的模型可以更容易地从它们映射到的表中进行更改。

    最后,您可以通过检查EF生成的SQL来查看一些线索。使用this帖子中描述的技术获取任何红色标记(例如EF正在寻找不存在的列):

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