Указанный член типа не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности

var result = (from bd in context.tblBasicDetails from pd in context.tblPersonalDetails.Where(x => x.UserId == bd.UserId).DefaultIfEmpty() from opd in context.tblOtherPersonalDetails.Where(x => x.UserId == bd.UserId).DefaultIfEmpty() select new clsProfileDate() { DOB = pd.DOB }); foreach (clsProfileDate prod in result) { prod.dtDOB = !string.IsNullOrEmpty(prod.DOB) ? Convert.ToDateTime(prod.DOB) : DateTime.Today; int now = int.Parse(DateTime.Today.ToString("yyyyMMdd")); int dob = int.Parse(prod.dtDOB.ToString("yyyyMMdd")); string dif = (now - dob).ToString(); string age = "0"; if (dif.Length > 4) age = dif.Substring(0, dif.Length - 4); prod.Age = Convert.ToInt32(age); } GetFinalResult(result); 

 protected void GetFinalResult(IQueryable result) { int from; bool bfrom = Int32.TryParse(ddlAgeFrom.SelectedValue, out from); int to; bool bto = Int32.TryParse(ddlAgeTo.SelectedValue, out to); result = result.AsQueryable().Where(p => p.Age >= from); } 

Здесь я получаю исключение:

Указанный член типа «Возраст» не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности.

Где Age нет в базе данных, это свойство, которое я создал в classе clsProfileDate для вычисления Age from DOB. Любое решение?

Вы не можете использовать свойства, которые не сопоставлены столбцу базы данных в выражении Where . Вы должны построить выражение, основанное на отображаемых свойствах, например:

 var date = DateTime.Now.AddYears(-from); result = result.Where(p => date >= p.DOB); // you don't need `AsQueryable()` here because result is an `IQueryable` anyway 

В качестве замены вашего свойства, не привязанного к Age вы можете извлечь это выражение в статический метод, например:

 public class clsProfileDate { // ... public DateTime DOB { get; set; } // property mapped to DB table column public static Expression> IsOlderThan(int age) { var date = DateTime.Now.AddYears(-age); return p => date >= p.DOB; } } 

И затем используйте его так:

 result = result.Where(clsProfileDate.IsOlderThan(from)); 

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

 result = result.ToList().Where(p => date >= p.DOB); 

Ответ Слаумы лучше, но это тоже сработает. Это стоит больше, потому что ToList () выполнит запрос по базе данных и перенесет результаты в память.

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

 public class Building { public string Description { get; } } var query = from building in context.Buildings select new { Desc = building.Description }; int count = query.ToList(); 

Вызов ToList даст такое же сообщение об ошибке. Это очень тонкая ошибка и очень трудно обнаружить.

Прежде всего, вам нужно понять, в чем причина вашей проблемы.

Для меня у меня была модель, вот так:

 public class SessionGroup { public int Id { get; set; } public int UserId { get; set; } private DateTime beginDate; private DateTime? endDate; public DateTime BeginDate { get { return beginDate; } set { beginDate = DateTimeHelper.ToUtc(value); } } public DateTime? EndDate { get { return endDate; } set { if (value.HasValue) endDate = DateTimeHelper.ToUtc(value.Value); else endDate = null; } } public bool IsSessionOpen { get { return EndDate == null; } } public bool IsSessionClosed { get { return !IsSessionOpen; } } } 

Позже в моем запросе я пытался сделать что-то вроде:

 ... .Where(usr => usr.Sessions.All(s => !s.IsSessionClosed)) 

Проблема здесь, как вы можете предположить, связана с IsSessionClosed которая является авто-имуществом и не является фактическим полем базы данных, однако я использовал это, потому что я не знал, что это не связано с фактическим столбцом БД.

Я забыл выбрать столбец (или установить / сопоставить свойство со значением столбца):

 IQueryable queryable = from t in dbcontext.SampleTable where ... select new DataModel { Name = t.Name }; 

Вызов queryable.OrderBy("Id") исключение, хотя DataModel имеет Id свойства.

Правильный запрос:

 IQueryable queryable = from t in dbcontext.SampleTable where ... select new DataModel { Name = t.Name, Id = t.Id }; 
  • большая проблема в преобразовании строки в datetime с использованием linq-to-entity
  • ASP.NET MVC 2.0 Реализация поиска в jqgrid
  • Массовое удаление в LINQ для объектов
  • Метод не может быть переведен в выражение хранилища
  • Entity Framework 4 / POCO - С чего начать?
  • LINQ to Entities не распознает метод
  • Как создать дерево выражений LINQ, чтобы выбрать анонимный тип
  • linq для объектов не распознает метод
  • LEFT JOIN в LINQ для объектов?
  • Предложение "NOT IN" в LINQ to Entities
  • Преобразование String в Int в EF 4.0
  • Давайте будем гением компьютера.