2013-11-22 2 views
4

У меня возникла странная проблема с $ select в службах передачи данных WCF в сочетании с Entity Framework. Объекты Entity Framework не отображаются непосредственно службой. Скорее, EF запрашивается, и результаты проецируются на DTO, который подвергается воздействию.WCF Data Services, DTO и Entity Framework: аргумент для DbIsNullExpression должен относиться к примитивному, перечисляемому или ссылочному типу

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

/Test.svc/Files

/Test.svc/Files? $ фильтр = Имя эк 'образец'

Но это не будет работать:

/Test.svc/Files?$sel ECT = Id

Он выдает это исключение в пределах EntityFramework кода базы:

Аргумент DbIsNullExpression должны относиться к примитивным, перечисление или ссылочного типа.

... на данный момент в стеке вызовов:

System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder.DbExpressionBuilder.ValidateIsNull (DbExpression аргумент, Boolean allowRowType)

См. Ниже подробные сведения об объектах. Свойство IQueryable находится в контейнере источника данных (реализующем IUpdatable), который используется службой.

  • Файл является основа сущности объекта, тянет dbContext.Files
  • EdmFile является DTO, что я проектирование до, и подвергая через службу OData.

Вот IQueryable подвергается мой контейнер данных:

public IQueryable<EdmFile> Files 
{ 
    get 
    { 

     var files = dbContext.Files //EF collection of File 
      .Select(f => new EdmFile() { Id = f.Id, Name = f.Name }); 

     return files; //return projection onto EdmFile 
    } 
} 

Если я вернусь files.ToList(), то $ выберите будет работать. Однако IQueryable будет преждевременно перечисляться, и ВСЕ файлы (игнорируя любой запрошенный $ filter и т. Д.) Будут извлекаться из базы данных.

Вот сущность/DTO Я фактически выставляя:

[DataServiceKey("Id")] 
public class EdmFile 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
} 

Вот Entity Framework объект:

public partial class File 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
} 

Я неоднократно пытался погуглить это и просматривал SO, но я не в состоянии чтобы получить результаты с результатами. Любая помощь будет оценена по этому поводу!

ответ