C#如何序列化system.linq.expressions?
我正在研究winRT和实体框架(到SQL),它们之间的通信层是WCF服务。在实体框架中,我使用的是存储库模式,我有以下方法:C#如何序列化system.linq.expressions?,c#,.net,wcf,entity-framework-5,iqueryable,C#,.net,Wcf,Entity Framework 5,Iqueryable,我正在研究winRT和实体框架(到SQL),它们之间的通信层是WCF服务。在实体框架中,我使用的是存储库模式,我有以下方法: public IQueryable<User> GetBySearch(Expression<Func<User, bool>> search) { return this.Context.Users.Where(search); } public IQueryable GetBySearch(表达式搜索) { 返回this.
public IQueryable<User> GetBySearch(Expression<Func<User, bool>> search)
{
return this.Context.Users.Where(search);
}
public IQueryable GetBySearch(表达式搜索)
{
返回this.Context.Users.Where(搜索);
}
一切正常,但当我将其添加到WCF时
[OperationContract]
IQueryable<User> GetUserBySearch(Expression<Func<User, bool>> search);
[运营合同]
IQueryable GetUserBySearch(表达式搜索);
以及:
public IQueryable GetUserBySearch(表达式搜索)
{
IUser user=new UserRepository();
返回user.GetBySearch(搜索);
}
但问题是表达式不可序列化,因此WCF无法序列化它。所以我想从它继承并使它[可序列化],但问题是它是一个密封的类
有人能帮我解决这个问题吗?如果您使用的是实体框架,那么WCF与Iqueryable和lambdas的配合不太好。这是一个快速而肮脏的解决方案,请根据您的需要进行调整 将服务合同更改为
[OperationContract]
IEnumerable<User> GetEventBySearch(UserCriteria search);
服务实施:
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
}
公共IEnumerable GetEventBySearch(UserCriteria搜索)
{
IUser user=new UserRepository();
表达式条件=构建表达式(搜索);
返回user.GetBySearch(条件).AsEnumerable();
}
专用表达式BuildExpression(UserCriteria搜索)
{
//在这里构建lambda表达式
}
将表达式更改为Func,您可以使用BinaryFormatter或其他序列化程序按照自己的意愿对其进行序列化例如,如果您真的需要它,也许可以使用WCF数据服务。如果您希望IQueryable在线,OData也是一个不错的选项。
[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
}