LINQ to Entities - รับฟิลด์เอนทิตีที่เกี่ยวข้องทั้งหมดลงในสตริง

ฉันมีบุคคลเอนทิตีบางอย่างเช่นนั้น

PersonId
PersonName
PersonPhone

ฉันมีนิติบุคคลบ้าน

HouseID
HouseType
HouseSize

ทั้งสองหน่วยงานมีความสัมพันธ์กันแบบหลายต่อหลายความสัมพันธ์ ฉันต้องมี HouseType ทั้งหมดสำหรับบุคคล (ซึ่งมีบ้านหลายหลัง) ไว้ในสตริง


person Kulpemovitz    schedule 02.02.2012    source แหล่งที่มา


คำตอบ (2)


คุณสามารถเชื่อมต่อหลายสตริงจากลำดับได้อย่างง่ายดายด้วย Enumerable.Aggregate วิธี.

ในกรณีของคุณ คุณจะต้อง ฉายภาพ รายการของ House เอนทิตีลงในรายการของสตริง House.HouseType ก่อน จากนั้นจึง รวม รายการเหล่านั้นเป็นสตริงเดียว:

var houseTypes = person.Houses.Select(i => i.HouseType).AsEnumerable();
var emptyResult = "0";

return houseTypes.Any() ?
    houseTypes.Select(i => i.ToString())
              .Aggregate((current, next) => current + ", " + next) :
    emptyResult;

หรือคุณสามารถพูดว่า:

var houseTypes = person.Houses
                       .Select(i => i.HouseType)
                       .AsEnumerable()
                       .Select(i => i.ToString());
return String.Join(", ", houseTypes);

ซึ่งจะส่งคืน สตริงว่าง เมื่อลำดับ houseTypes ว่างเปล่า

อัปเดต:

หากคุณใช้ Entity Framework 4 ขึ้นไป คุณจะใช้ฟังก์ชัน SQL ในตัว รายการใดรายการหนึ่งเพื่อทำการแปลงได้ เพื่อสตริงโดยตรงในฐานข้อมูล:

var houseTypes = person.Houses
                       .Select(i => SqlFunctions.StringConvert((double)i.HouseType))
                       .AsEnumerable()
return String.Join(", ", houseTypes);
person Enrico Campidoglio    schedule 02.02.2012
comment
houseType ของฉันไม่ใช่สตริงดังนั้นฉันจึงได้รับข้อผิดพลาด ไม่สามารถแปลงประเภท 'สตริง' เป็น 'สั้น' โดยปริยาย - person Kulpemovitz; 02.02.2012
comment
@Kulpemovitz หากคุณสมบัติ HouseType เป็นประเภทสั้น คุณสามารถแปลงเป็นสตริงด้วย ToString() ฉันอัปเดตตัวอย่างของฉัน - person Enrico Campidoglio; 02.02.2012
comment
เยี่ยมเลย แต่ตอนนี้มันจะล้มเหลวถ้าบุคคลนั้นไม่มีบ้าน แต่ฉันยังต้องการคนที่อยู่ในผลลัพธ์ - person Kulpemovitz; 02.02.2012
comment
คุณคิดอย่างไร? person.Houses.Count › 0 ? vs.person.Select(i =› i.HouseType.ToString()).รวม((ปัจจุบัน, ถัดไป) =› ปัจจุบัน + , + ถัดไป) : 0 - person Kulpemovitz; 02.02.2012
comment
@Kulpemovitz คุณน่าจะได้รับข้อยกเว้นโดยระบุว่า Sequence contains no elements เมื่อ Select วิธีการส่งคืนลำดับว่าง ฉันอัปเดตคำตอบของฉันแล้ว - person Enrico Campidoglio; 02.02.2012
comment
ฉันจะอยู่กับไวยากรณ์ของฉัน ขอบคุณ - person Kulpemovitz; 02.02.2012
comment
สิ่งนี้ใช้ไม่ได้กับ linq ไปยังเอนทิตี (ทั้ง .ToString และ .Aggregate ไม่สามารถแปลได้) มันทำงานใน linq ไปยังวัตถุ แต่นั่นไม่ใช่สิ่งที่คำถามถูกแท็ก - person John; 16.01.2014

คุณหมายถึงบางอย่างเช่น?:

var data = context.People.Where(p => p.PersonId == <id>).SelectMany(p => p.Houses).Select(h => h.HouseType);
var result = string.Join(<separator>, data);
person cincura.net    schedule 02.02.2012