Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#如何序列化system.linq.expressions?_C#_.net_Wcf_Entity Framework 5_Iqueryable - Fatal编程技术网

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

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.

我正在研究winRT和实体框架(到SQL),它们之间的通信层是WCF服务。在实体框架中,我使用的是存储库模式,我有以下方法:

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
}