C#如何序列化system.linq.expressions?

我正在研究winRT和entity framework(到SQL),它们之间进行通信的层是WCF服务。 在entity framework中,我使用的是Repository Pattern,我有方法:

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

一切正常,但是当我把它添加到WCF

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

和:

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

但是Expression不能序列化的问题,因此,WCF无法序列化它。 所以我想inheritance它并使其成为[Serializable]但问题是它是一个密封的类。

有人可以帮我解决问题吗?

如果你正在使用Entity Framework,WCF不能与Iqueryable和lambdas一起使用。 这是一个快速而肮脏的解决方案,可根据您的需求进行调整。

将服务合同更改为

 [OperationContract] IEnumerable 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 GetEventBySearch(UserCriteria search) { IUser user = new UserRepository(); Expression> criteria = BuildExpression(search); return user.GetBySearch(criteria).AsEnumerable(); } private Expression> BuildExpression(UserCriteria search) { // build lambda expression here } 

将表达式更改为Func,您可以使用BinaryFormatter或其他序列化程序按您的意愿将其序列化

您可以使用ServicePredicateBuilder来序列化表达式。 http://www.codeproject.com/Articles/851187/ServicePredicateBuilder-for-creating-Serializable