Как запросить IDBSet через linq

54
2

У меня есть таблица, которую я пытаюсь запросить, чтобы создать меню. Я также обращаюсь к связанным таблицам, чтобы скомбинировать результат. У меня есть проект моделей, содержащий все мои модели данных. В моем файле Entities у меня есть

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

Однако, когда я выполняю запрос на своей странице, он возвращает эту ошибку.

Указанный член типа 'MenuID' не поддерживается в 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; }

спросил(а) 2016-02-05T18:10:00+03:00 4 года, 5 месяцев назад
1
Решение
55

Трудно сказать точно, не видя всех классов моделей и вашей базы данных. Некоторые вещи для проверки:

Убедитесь, что каждый соответствующий столбец "MenuID" существует в каждой базовой таблице. Поскольку вы не используете конфигурации сопоставления, вам нужно убедиться, что имена столбцов следуют за назначением EF. Проверьте их взаимосвязь между двумя таблицами.

С более общей точки зрения, я бы рассмотрел использование классов конфигурации, чтобы ваши отношения были явными, и ваша модель легче изменить из таблиц, на которые они сопоставляются.

Наконец, вы можете увидеть некоторые подсказки, проверив SQL, сгенерированный EF. Используйте технику, описанную в этой статье, для любых красных флагов (например, EF ищет столбец, который не существует):

var result = from x in appEntities
where x.id = 32
select x;

var sql = ((System.Data.Objects.ObjectQuery)result).ToTraceString();

ответил(а) 2016-02-05T19:57:00+03:00 4 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема