2015-02-03 5 views
3

У меня есть класс, используемый Entity Framwork, который называется EFApplication.OData and Entity Framework разные моделирование

this link, я хочу добавить OData запрос к моему контроллеру Web Api.

Однако, я не хочу использовать класс EFApplication в качестве параметров запроса.

Я хочу использовать другой класс, который используется только для OData запросов (ODataApplication)

Возможно ли это?

Одна из причин, я хочу использовать другой класс, потому что OData не поддерживает DateTime свойства, и это означает, что мне нужно изменить его DateTimeOffset, что я не могу это сделать (не нарушая много других вещей)

.
// class mapped to Entity Frameowrk/Database 
public class EFApplication 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual DateTime DateCreated { get; set; } 
} 

// class used for OData querying only 
public class ODataApplication 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

public class ApplicationsController : ApiController 
{ 
    [EnableQuery] 
    public IQueryable<EFApplication> Get(ODataQueryOptions<ODataApplication> options) 
    { 
     // how to apply ODataQueryOptions<ODataApplication> query on top of EFApplication 

     return result; // IEnumerable<EFApplication> 
    } 
} 
+0

Одним из возможных решений для заполнения EdmModel вручную на основе класса EFApplication но игнорировать 'DateTime' поле. Тогда вы сможете использовать его OData –

+0

Можете ли вы привести пример? – Catalin

ответ

0

Вы можете решить эту проблему с ее особенностью проекта() Automapper и К()

// ViewModel class mapped to Entity Framework Model class 
public sealed class EFApplicationViewModel 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public DateTimeOffset DateCreated { get; set; } 
} 

в контроллере для образца:

[EnableQuery] 
    public IQueryable<EFApplication> Get(ODataQueryOptions<ODataApplication> options) 
    { 
     IQueryable<EFApplication> queryable = EFApplicationRepository.All(); 
     IQueryable<EFApplicationViewModel> projected = queryable.Project().To<EFApplicationViewModel>(); 

     return projected; 
    } 

В дополнение в Automapper вы должны установить немного «исправить» для DateTimeOffset (опять вздыхаю ...)

Mapper.CreateMap<EFApplication, EFApplicationViewModel>(); 
Mapper.CreateMap<DateTime, DateTimeOffset>().ProjectUsing(src => src); 
Mapper.CreateMap<DateTime, DateTimeOffset>().ConvertUsing(src => DateTime.SpecifyKind(src, DateTimeKind.Utc)); 
+0

Как «применить» параметр параметров поверх «запрашиваемых» элементов (или «проецируемых» элементов)? – Catalin

+0

Возвращаемое значение filtererd по вашим опциям OData без кода вашей части. Атрибут действует таким образом. Если вы хотите сделать что-то из меня сложным, вы можете удалить атрибут et "apply" вашего параметра odata с помощью кода вроде этого: options.ApplyTo (projected, {ODataQuerySettings)}

+1

Это не работает :(Я получаю это сообщение об ошибке: 'Невозможно применить ODataQueryOptions 'Api.Web.Api.OData.ODataApplication' к IQueryable из 'Api.Web.Api.Models.EFApplicationViewModel'. Имя параметра: query' – Catalin

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