У меня возникла странная проблема с $ 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, но я не в состоянии чтобы получить результаты с результатами. Любая помощь будет оценена по этому поводу!