3

私は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】にしようと思ったのですが、sealedクラスであることが問題。

誰かが問題を解決するのを手伝ってくれますか?

4

2 に答える 2

1

Entity Framework を使用している場合、WCF は Iqueryable とラムダでうまく機能しません。これは迅速で汚い解決策であり、ニーズに合わせて調整してください。

サービス契約を次のように変更します

[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
}
于 2013-08-09T11:14:19.763 に答える
0

式を Func に変更すると、 BinaryFormatter またはその他のシリアライザーを使用して、必要に応じてシリアル化できます

于 2013-08-29T16:43:44.243 に答える