2013-08-09 3 views
2

Я работаю над winRT и сущностью (для SQL), слой, который обменивается данными между ними, - это служба WCF. В рамках сущности я использую Repository Pattern и у меня есть метод:C# Как сериализовать system.linq.expressions?

public IQueryable<User> GetBySearch(Expression<Func<User, bool>> search) 
{ 
    return this.Context.Users.Where(search); 
} 

Все отлично работает, но когда я добавляю его в WCF

[OperationContract] 
IQueryable<User> GetUserBySearch(Expression<Func<User, bool>> search); 

и:

public IQueryable<User> GetUserBySearch(Expression<Func<User, bool>> search) 
{ 
    IUser user = new UserRepository(); 
    return user.GetBySearch(search); 
} 

Но проблема в том, что выражение не является сериализуемым, поэтому WCF не может его сериализовать. Поэтому я решил унаследовать его и сделать его [Serializable], но проблема в том, что это запечатанный класс.

Может кто-нибудь помочь мне решить эту проблему?

+2

Смотрите, например http://stackoverflow.com/questions/4291370/expose-iqueryable-over-wcf-service – xanatos

+0

Если вы действительно хотите, может быть, вы могли бы http://stackoverflow.com/questions/ 7183199/serializing-iqueryableof-t – xanatos

+0

Используйте службы передачи данных WCF. – leppie

ответ

1

WCF не очень хорошо работает с Iqueryable и lambdas, если вы используете Entity Framework. Это быстрое и грязное решение, адаптируемое к вашим потребностям.

Изменить сервисный контракт на

[OperationContract] 
IEnumerable<User> GetEventBySearch(UserCriteria search); 

Где UserCriteria является DataContract, который содержит свойство для каждого критерия поиска, что вам нужно - пример: реализации

[DataContract] 
public class UserCriteria 
{ 
    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public string Email { get; set; } 

    // add a property for each search criteria.... 
} 

Услуги:

public IEnumerable<User> GetEventBySearch(UserCriteria search) 
{ 
    IUser user = new UserRepository(); 
    Expression<Func<User, bool>> criteria = BuildExpression(search); 

    return user.GetBySearch(criteria).AsEnumerable(); 
} 

private Expression<Func<User, bool>> BuildExpression(UserCriteria search) 
{ 
    // build lambda expression here 
} 
+3

OData также является хорошим вариантом, если вы хотите IQueryable по кабелю. – tucaz

0

Смена выражения для Func, вы можете использовать двоичный файл или отменить ее Сериализаторы Сериализовать это, как вы пожелаете

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