2013-03-13 3 views
1

Я использую EF5 Code First models. Рассмотрим следующий Entity Framework запрос:Сохраните структуру Entity Framework от выполнения свойств или методов расширения

var results = from i in context.Table1 
      where i.ID == Id // passed in 
      select new TableInfo() 
      { 
       Name = i.Name, 
       ActionDate = i.Action.ActionDate, 
       CreatedDate = i.Action.CreatedDate, 
       CreatedBy = i.Action.CreatedBy.FullName 
      }; 

FullName свойство определяется таким образом:

[NotMapped] 
[Display(Name = "Full Name")] 
public string FullName 
{ 
    get 
    { 
     string ret = string.Empty; 
     if (String.IsNullOrEmpty(LAST_NAME) || String.IsNullOrEmpty(FIRST_NAME)) 
     { 
      return ""; 
     } 
     else 
     { 
      return string.Format("{0}, {1}", LAST_NAME, FIRST_NAME); 
     } 

    } 
} 

Я получаю ошибку:

The specified type member 'FullName' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

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

ответ

2

Проблема заключается выражение в инициализаторе выбора пункта:

CreatedBy = i.Action.CreatedBy.FullName 

Это вызывает у поставщика Linq-на-Сущности, чтобы попытаться найти отображение для свойства с именем «FullName». То же самое относится к тому, если вы попытаетесь использовать метод расширения.

Вы можете сделать это, хотя:

var results = 
    from i in context.Table1 
    where i.ID == Id // passed in 
    select new TableInfo() 
    { 
     Name = i.Name, 
     ActionDate = i.Action.ActionDate, 
     CreatedDate = i.Action.CreatedDate, 
     CreatedBy = i.Action.CreatedBy 
    }; 

И затем использовать item.CreatedBy.FullName для доступа имя с помощью вашего пользовательского свойства

Смежные вопросы