Odata v4 - $expand lalu ratakan hasilnya

Tujuan: Untuk memperluas objek, dan memproyeksikan properti bertumpuk, ke pemilihan akar, bersama dengan props lainnya.

Memiliki hubungan sebagai berikut:

public class Product {
   public string Barcode { get; set; }
   public double Price { get; set; }
   public Category Category { get; set; }
}

public class Category {
   public string Name { get; set; }
}

Saya ingin membuat proyeksi yang hasilnya seperti ini:

{
   "@odata.context": "http://localhost/odata/$metadata#Product",
   "value": [
      {
         "Price": 500,
         "Name": "Meat Products" // this is category name, ideally would be to rename it to CategoryName
      }
   ]
}

Dimana saat ini saya mendapatkan ini:

{
   "@odata.context": "http://localhost/odata/$metadata#Product",
   "value": [
      {
         "Price": 500,
         "Category": {
            "Name": "Meat Products"
         }
      }
   ]
}

Kueri yang digunakan adalah sebagai berikut:

/odata/Product?$expand=Category($select=Name)&$select=Price

Saya berharap untuk menulis proyeksi seperti ini:

/odata/Product?$expand=Category&$select=Price,Category/Name as CategoryName

or

/odata/Product?$expand=Category&$select=Price,Category($select=Name as CategoryName)

or

/odata/Product?$expand=Category&$select=Price,Category($select=Name)

Apakah itu bisa dicapai? Terima kasih!

P.S. OData V4.


person Cristian E.    schedule 15.11.2016    source sumber


Jawaban (1)


Hal ini tidak dapat dicapai dengan semantik kueri odata v4. Seperti yang Anda lihat, isi respons berisi baris:

"@odata.context": "http://localhost/odata/$metadata#Product"

Hal ini untuk menunjukkan bahwa seluruh payload respons mewakili sebuah instance dari tipe 'Produk'. Misalkan properti 'CategoryName' tidak ada pada tipe tersebut, maka tidak mungkin untuk menginstruksikan layanan untuk secara dinamis menambahkan properti melalui klausa 'AS'. Dan kata kunci 'AS' juga tidak ada dalam spesifikasi kueri OData standar.

Namun, mengembalikan properti tambahan di luar metadata memang sah, lihat Referensi.

Klien HARUS siap menerima properti tambahan dalam entitas atau instans tipe kompleks yang tidak diiklankan dalam metadata, bahkan untuk tipe yang tidak ditandai sebagai terbuka.

Jadi dalam kasus ini, layanan hanya dapat mengembalikan properti 'virtual' tambahan 'CategoryName' sebagai respons. (Jika Anda adalah pemilik layanan, Anda dapat memperbarui logika respons dan melakukan perubahan.) Ini mungkin merupakan perilaku layanan, bukan reaksi terhadap permintaan klien tertentu.

person Karata    schedule 21.11.2016
comment
Terima kasih. Sekarang saya mengerti alasan di balik pembatasan ini. Menambahkan prop virtual, mungkin bukan ide terbaik dalam kasus saya karena api digunakan dengan $expands yang berbeda oleh konsumen yang berbeda. Meskipun agak membuat frustrasi karena tidak ada cara untuk membuat Proyeksi dengan $select terakhir. Sepertinya ini hanya .Select dan dimasukkan ke tipe objek anonim, tapi saya mungkin salah. - person Cristian E.; 21.11.2016
comment
Anda dapat melakukannya dengan menjadikan entitas data Anda sebagai OpenType, lalu Anda dapat memasukkan properti anak secara manual ke dalam kantong DynamicProperties pada entitas Anda yang sekarang terbuka. Namun apakah ada argumen yang baik untuk melakukan hal ini? Saya tidak yakin... setelah Anda menyerahkan output secara manual untuk operasi GET, Anda sekarang harus mengurai secara manual setiap POST atau PATCH yang dikembalikan klien, jika Anda bermaksud mendukung klien memodifikasi proyeksi yang Anda berikan. Saya merasa lebih mudah untuk hanya memperbarui klien untuk menangani struktur bersarang, namun Anda mungkin tidak memiliki fleksibilitas ini. - person Chris Schaller; 23.11.2016