EF 4: указанный тип члена '*' не поддерживается в LINQ to Entities

У меня есть такой класс:

[Table("MyTable")]
class MyClass         
{   
        //properties; id, name, etc...

        private string _queuedToWHTime = string.Empty;
        [Column("QueuedToWHTime")]
        public string QueuedToWHTime
        {
            get { return _queuedToWHTime; }
            set { _queuedToWHTime = value; }
        }

        public DateTime? QueuedToWHTime_DateTime
        {
            get
            {
                if (!string.IsNullOrWhiteSpace(_queuedToWHTime))
                {
                    return Convert.ToDateTime(_queuedToWHTime);
                }
                return null;
            }
        }
}

и таблица (MyTable):

CREATE TABLE webnews_in
(
Id                INT NOT NULL auto_increment,
QueuedToWHTime    VARCHAR (50) NULL
...
PRIMARY KEY (Id)
);

когда я пытаюсь сделать запрос вот так:

var searchRslt=(from m in queryableNews
    orderby m.QueuedToWHTime_DateTime descending
    select m).ToList();

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

2 ответа

Решение

Вы не можете запросить с EF на пользовательских свойств. Пользовательское свойство не может быть переведено в SQL.

Вы можете сделать это, чтобы заставить заказ быть выполненным "в памяти".

var searchRslt = queryableNews
    .AsEnumerable()
    .OrderBy(m => m.QueuedToWHTime_DateTime)
    .ToList();

Вопрос здесь:

var searchRslt=(from m in queryableNews
orderby m.QueuedToWHTime_DateTime descending
select m).ToList();

вы пытаетесь использовать собственность .QueuedToWHTime_DateTime, но это не существует в базе данных. Вам нужно использовать имена, которые используются в базе данных. В этом случае .QueuedToWHTimeТак:

var searchRslt=(from m in queryableNews
orderby m.QueuedToWHTime descending
select m).ToList();

Если свойство базы данных в этом сценарии не используется, вам придется извлечь весь список, преобразовать его в IEnumerable (любой подойдет), а затем отфильтровать / упорядочить этот IEnumerable по его свойству.

Что-то вроде этого:

var result = queryableNews.ToList().OrderbyDescending(x=>x.QueuedToWHTime_DateTime).ToList();
Другие вопросы по тегам