WCF服务 - 序列化Linq参数

时间:2018-03-08 15:12:29

标签: c# wcf serialization

我有一个简单的课程:

[DataContract]
public class Book
{
    [DataMember]
    public Int32 ID { get; set; }

    [DataMember]
    public Nullable<Int32> AuthorID { get; set; }     
}

通过WCF服务检索,如:

public class BookService : IBookService
    {
        IService _service;

        public BookService()
        {
            _service = new BookService();
        }

        public IEnumerable<Book> GetBooks()
        {
            var Books = _service.GetBooks();
            return Books;
        }                
    }

我现在想要扩展它以包含一个额外的函数,该函数允许LINQ查询在Book类中包含其他属性(未在上面的缩减示例中显示)。这个函数(在MVC应用程序中包含和调用时有效)是:

    public IEnumerable<Book> GetBooks(params Expression<Func<Book, object>>[] includes)
    {
        var Books = _service.GetBooks(Expression<Func<Book, object>>[]>(includes));
        return Books;
    }

但是,从WCF服务运行时会生成错误,因为它无法序列化:

  

System.ServiceModel.Description.DataContractSerializerOperationBehavior contract:http://tempuri.org/:IBookService ----&gt; System.Runtime.Serialization.InvalidDataContractException:类型'System.Linq.Expressions.Expression 1[System.Func 2 [Foo.Book,System.Object]]'无法序列化。请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员。如果类型是集合,请考虑使用CollectionDataContractAttribute标记它。

我将DataContract / DataMember属性添加到类中以便可以序列化,但是我不确定我需要做什么来允许函数参数被序列化。

任何人都有关于如何在WCF服务中使用此功能的想法?

2 个答案:

答案 0 :(得分:0)

它可能与使用Expression有关吗?:

Why would you use Expression<Func<T>> rather than Func<T>?

答案 1 :(得分:0)

类似数组的通用列表不是Serializable,所以这就是为什么你得到错误。更改代码,以便将要返回的字段列表传递到可以序列化的对象中。在可以序列化的对象中传递参数后,您的函数应该在Web服务中工作。

[Data Contract] 
public class Field
{
   [DataMember]
   public string FieldName {get; set;}
}

然后你可以把它传递给函数

List<Fields> fieldList = new List<Field>();
fieldList.Add(new Field("Field1");
fieldList.Add(new Field("Field2");
_service.GetBooks(Expression<Func<Book, object>>[]>(fieldList));

**不确定最后一行的语法,我没有使用很多表达式