Odata v4 - $ขยายแล้วทำให้ผลลัพธ์ราบเรียบ

วัตถุประสงค์: เพื่อขยายออบเจ็กต์ และฉายภาพคุณสมบัติที่ซ้อนกัน ไปยังการเลือกรูท ควบคู่ไปกับอุปกรณ์ประกอบฉากอื่นๆ

มีความสัมพันธ์ดังต่อไปนี้

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; }
}

ฉันต้องการทำการฉายภาพซึ่งจะส่งผลให้:

{
   "@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
      }
   ]
}

ขณะนี้ฉันได้รับสิ่งนี้ที่ไหน:

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

แบบสอบถามที่ใช้มีดังต่อไปนี้:

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

ฉันคาดว่าจะเขียนภาพเช่นนี้:

/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)

เป็นไปได้ไหม? ขอบคุณ!

ป.ล. โอดาต้า V4.


person Cristian E.    schedule 15.11.2016    source แหล่งที่มา


คำตอบ (1)


สิ่งนี้ไม่สามารถทำได้ด้วยความหมายคิวรี odata v4 อย่างที่คุณเห็น เนื้อหาการตอบกลับประกอบด้วยบรรทัด:

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

นี่เป็นการระบุเพย์โหลดการตอบสนองทั้งหมดแสดงถึงอินสแตนซ์ประเภท 'ผลิตภัณฑ์' สมมติว่าไม่มีคุณสมบัติ 'CategoryName' ในประเภทนั้น จึงเป็นไปไม่ได้ที่จะสั่งให้บริการเพิ่ม ไดนามิก ผ่านทางส่วนคำสั่ง 'AS' และคำสำคัญ 'AS' ยังไม่มีอยู่ในข้อมูลจำเพาะแบบสอบถาม OData มาตรฐาน

อย่างไรก็ตาม เป็นการถูกต้องที่จะส่งคืนคุณสมบัติเพิ่มเติมนอกเหนือจากข้อมูลเมตา โปรดดูที่ ข้อมูลอ้างอิง

ลูกค้าต้องเตรียมพร้อมที่จะรับคุณสมบัติเพิ่มเติมในเอนทิตีหรืออินสแตนซ์ประเภทที่ซับซ้อนที่ไม่ได้โฆษณาในเมตาดาต้า แม้ว่าจะเป็นประเภทที่ไม่ได้ทำเครื่องหมายว่าเปิดก็ตาม

ดังนั้นในกรณีนี้ บริการอาจส่งคืนคุณสมบัติ 'เสมือน' เพิ่มเติม 'CategoryName' ในการตอบกลับ (หากคุณเป็นเจ้าของบริการ คุณสามารถอัปเดตตรรกะการตอบกลับและทำการเปลี่ยนแปลงได้) นี่อาจเป็นพฤติกรรมของบริการ ไม่ใช่การตอบสนองต่อคำถามของลูกค้าบางราย

person Karata    schedule 21.11.2016
comment
ขอบคุณ ตอนนี้ฉันเห็นเหตุผลเบื้องหลังข้อจำกัดนี้แล้ว การเพิ่มอุปกรณ์ประกอบฉากเสมือนอาจไม่ใช่ความคิดที่ดีที่สุดในกรณีของฉัน เนื่องจากมีการใช้ API กับ $expands ที่แตกต่างกันโดยผู้บริโภคที่แตกต่างกัน แม้ว่าจะน่าหงุดหงิดเล็กน้อยที่ไม่มีวิธีใดที่จะสร้างการฉายภาพด้วยการเลือก $ สุดท้ายได้ ดูเหมือนว่าจะเป็นเพียง .Select และส่งไปยังประเภทวัตถุที่ไม่ระบุชื่อ แต่ฉันอาจผิด - person Cristian E.; 21.11.2016
comment
คุณสามารถทำได้โดยทำให้เอนทิตีข้อมูลของคุณเป็น OpenType จากนั้นคุณสามารถแทรกคุณสมบัติย่อยลงในกระเป๋า DynamicProperties บนเอนทิตีที่เปิดอยู่ของคุณตอนนี้ได้ด้วยตนเอง แต่มีเหตุผลที่ดีในการทำเช่นนี้หรือไม่? ฉันไม่แน่ใจ... เมื่อคุณส่งเอาต์พุตสำหรับการดำเนินการ GET ด้วยตนเอง ตอนนี้คุณต้องแยกวิเคราะห์ POST หรือ PATCH ใด ๆ ที่ไคลเอนต์ส่งคืนด้วยตนเอง หากคุณต้องการสนับสนุนไคลเอนต์ในการแก้ไขการฉายภาพที่คุณให้ไว้ ฉันพบว่าการอัปเดตไคลเอนต์เพื่อจัดการกับโครงสร้างที่ซ้อนกันนั้นง่ายกว่ามาก แต่คุณอาจไม่มีความยืดหยุ่นขนาดนี้ - person Chris Schaller; 23.11.2016