[英]WCF Service - Serialize Linq parameter
我有一個簡單的課程:
[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.Expression
1[System.Func
2 [Foo。 Book,System.Object]]'無法序列化。 請考慮使用DataContractAttribute屬性對其進行標記,並使用DataMemberAttribute屬性標記要序列化的所有成員。 如果類型是集合,請考慮使用CollectionDataContractAttribute對其進行標記。
我將DataContract / DataMember屬性添加到類中以便可以序列化,但是我不確定我需要做什么來允許函數參數被序列化。
任何人都有關於我可以做什么的想法,以允許在WCF服務中使用此功能?
它可能與表達式的使用有關嗎?:
像數組這樣的通用列表不是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));
**不確定最后一行的語法,我沒有很多表達式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.