2015-07-27 4 views
0

У меня есть этот сервис:LINQ к Entities не распознает метод метода «Boolean HasFlag (System.Enum)», и этот метод не может быть переведен в выражение магазина

//seroiunoiweucroewr 
///wercewrwerwerwer 
//wcererewrwerwer 
public List<UserRoleContract> GetRolePagesByUserId(long plngUserId, DisplayType displayType) 
{    
    List<UserRoleContract> result = new List<UserRoleContract>();    
    using (CitiCallEntities context = new CitiCallEntities()) 
    { 
     try 
     { 
      //var DisplayList = Utility.GetEnumDescriptions(typeof(DisplayType)).ToList(); 

      //var selectValue = DisplayList.Where(i => i.Key == (byte) DisplayType.Windows).FirstOrDefault(); 

      result = (from oUser in context.User 

         join oUserRole in context.UserRole on oUser.Id equals oUserRole.UserId 

         join oRoleRightsPage in context.RoleRightsPage.Where(i => i.IsActive == true) 
         on oUserRole.RoleId equals oRoleRightsPage.RoleId 
         join oApplicationPage in context.ApplicationPage.Where(i => i.IsActive == true) 
         on oRoleRightsPage.PageId equals oApplicationPage.Id 

         join oRole in context.Role on oUserRole.RoleId equals oRole.Id 

         join oEmployee in context.Employee on oUser.EmployeeId equals oEmployee.Id 
         join oSection in context.Section on oEmployee.SectionId equals oSection.Id 
         where oUser.IsActive == true && oUser.Id == plngUserId 
         && oRole.IsActive == true && (((DisplayType)oRoleRightsPage.DisplayType).HasFlag(displayType)) 

//am getting error in has flag 
// am having three display type web, windows and all 
// how to overcome 
         select new UserRoleContract 
         { 
          UserId = oUser.Id, 
          RoleId = oRole.Id, 
          RoleName = oRole.RoleName, 
          PageID = oApplicationPage.Id, 
          PageName = oApplicationPage.PageName, 
          IsOPsCtrl = oRole.IsOPsCtrl, 
          ISOPsCtrlFor = oRole.OPsCtrlFor, 
          SectionId = oSection.Id, 
          DisplayType = oRoleRightsPage.DisplayType, 
         }).Distinct().ToList(); 
     } 
     catch (Exception exception) 
     { 
      HandleExpcetion(exception); 
      //throw new CitiCallException(exception.Message); 
     } 
    } 
    return result; 
} 

Я получаю ошибку Linq в имеет преобразование флага, как мне решить эту проблему?

+0

в LINQ вы не можете вызвать функцию, даже если вы пытаетесь вызвать ToList() функция внутри запроса я вызову ошибку. лучший способ - создать переменную для функции удержания, а затем вызвать эти переменные из вашего решения linq –

+0

.... может помочь решить проблему –

+0

как создать переменные? – Prasanna

ответ

0

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

Итак, когда запрос переведен, он обнаружил, что этот метод недоступен, и именно по этой причине вы получаете ошибку.

одно решение, чтобы избежать этой ошибки

  1. Бринд все данные из databae

  2. Чем фильтр, чем данные, т.е. применить метод HasFlag из него.

Но это принесет все данные и может снизить производительность.

Пример является

удалить эту строку (((DisplayType)oRoleRightsPage.DisplayType).HasFlag(displayType) из вашего запроса

var list = querieddata //first fetch data without hasflag condition/method 
        .AsEnumerable() // Rest of the query in-process 
        .Where(oRoleRightsPage=> ((DisplayType)oRoleRightsPage.DisplayType).HasFlag(displayType))//apply condition here once fetching done 
        .ToList(); 
+0

querieddata не существует в текущем документе \ – Prasanna

+0

@Prasanna - querieddata здесь получает замену в запросе, который вы написали ... –

+0

wt query? i dnt knw – Prasanna

0

Метод HasFlag не имеет аналогов в Linq к Entities и именно поэтому вы получаете эту ошибку. Вы можете обойти это, используя побитовое сравнение вместо HasFlag, например так:

((DisplayType)oRoleRightsPage.DisplayType).HasFlag(displayType) 

СТАНОВИТСЯ:

(oRoleRightsPage.DisplayType & displayType) > 0 
+0

operayion & не может применяться к операндам типа byte – Prasanna