【问题标题】:C# How to serialize system.linq.expressions?C#如何序列化system.linq.expressions?
【发布时间】:2013-08-11 04:17:11
【问题描述】:

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

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);
}

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

谁能帮我解决这个问题?

【问题讨论】:

标签: c# .net wcf entity-framework-5 iqueryable


【解决方案1】:

如果您使用的是实体框架,WCF 不能很好地与 Iqueryable 和 lambdas 配合使用。这是一个快速而肮脏的解决方案,请根据您的需要进行调整。

将服务合同改为

[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
}

【讨论】:

  • OData 也是一个不错的选择,如果您希望通过网络实现 IQueryable。
【解决方案2】:

把你的表达式改成 Func ,你可以使用 BinaryFormatter 或者其他的序列化器随意序列化它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2016-06-15
    • 1970-01-01
    • 2018-10-11
    相关资源
    最近更新 更多