Entity Framework ограничивает длину возвращаемого столбца nvarchar - PullRequest
0 голосов
/ 01 апреля 2011

Я хочу ограничить длину столбца в запросе EF, ala:

 var query = from ce in entities.ContactEvents
              .Include("Person")
              .Include("Orders")
             where ce.PersonID = personID
             orderby ce.DateTimeContact descending
             select new ContactEvent 
             {
                  ID = ce.ID,
                  DateTimeContact = ce.DateTimeContact,
                  Description = ce.Description.Substring(0, 500),
                  Orders = ce.Orders
             };

Запрос не выполнен, поскольку EF не может проецировать сложный тип Orders.

Сущность или сложный тип Model.ContactEvent нельзя создать в запросе LINQ to Entities.

Я пробовал несколько разных способов сделать то же самое, например, использовать явное соединение в выражении LINQ, но до сих пор я всегда сталкивался с проблемой, заполняющей коллекцию Orders в проекции выбора.

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

1 Ответ

1 голос
/ 01 апреля 2011

Вы не можете проецировать на типы объектов. Это ограничение. Если вы хотите вернуть проекцию (вызов select new), вы должны либо вернуть анонимный тип, либо пользовательский, не являющийся типом сущности. Если вы хотите вернуть тип сущности, вы всегда должны возвращать весь столбец из linq-to-entity. Вы можете попытаться обрезать столбец после материализации объекта, используя:

 var data = (from ce in entities.ContactEvents
              .Include("Person")
              .Include("Orders")
             where ce.PersonID = personID
             orderby ce.DateTimeContact descending
             select ce)
             .AsEnumerable()
             .Select(e => new ContactEvent 
             {
                  ID = e.ID,
                  DateTimeContact = e.DateTimeContact,
                  Description = e.Description.Substring(0, 500),
                  Orders = e.Orders
             });
...