簡體   English   中英

WCF服務 - 序列化Linq參數

[英]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服務中使用此功能?

它可能與表達式的使用有關嗎?:

為什么要使用Expression <Func <T >>而不是Func <T>?

像數組這樣的通用列表不是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM