我有一个简单的课程:
[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 ----> System.Runtime.Serialization.InvalidDataContractException:输入'System.Linq.Expressions.Expression1 [System.Func2 [Foo.Book] ,System.Object]]'无法序列化 . 请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员 . 如果类型是集合,请考虑使用CollectionDataContractAttribute对其进行标记 .
我将DataContract / DataMember属性添加到类中以便可以序列化,但是我不确定我需要做什么来允许函数参数被序列化 .
任何人都有关于我可以做什么的想法,以允许在WCF服务中使用此功能?
2 回答
它可能与表达式的使用有关吗?:
Why would you use Expression<Func<T>> rather than Func<T>?
像数组这样的通用列表不是Serializable,所以这就是你得到错误的原因 . 更改代码,以便将要返回的字段列表传递到可以序列化的对象中 . 在可以序列化的对象中传递参数后,您的函数应该在Web服务中工作 .
然后你可以将它传递给函数
**不确定最后一行的语法,我没有很多表达式