LINQ ke Entitas - masukkan semua bidang entitas terkait ke dalam string

Saya memiliki Entitas Orang seperti itu

PersonId
PersonName
PersonPhone

Saya memiliki Entitas Rumah

HouseID
HouseType
HouseSize

Kedua Entitas tersebut berelasi dengan relasi banyak ke banyak. Saya perlu memasukkan semua HouseType untuk seseorang (yang memiliki banyak rumah) ke dalam sebuah string.


person Kulpemovitz    schedule 02.02.2012    source sumber


Jawaban (2)


Anda dapat dengan mudah menggabungkan beberapa string dari suatu urutan dengan Enumerable.Aggregate metode.

Dalam kasus Anda, Anda harus memproyeksikan terlebih dahulu daftar House entitas ke dalam daftar House.HouseType string dan kemudian mengagregasi menjadi satu string:

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;

Alternatifnya, Anda cukup mengatakan:

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

yang akan mengembalikan string kosong ketika urutan houseTypes kosong.

Pembaruan:

Jika Anda menggunakan Entity Framework 4 atau lebih tinggi, Anda dapat menggunakan salah satu fungsi SQL bawaan untuk melakukan konversi untuk merangkai langsung di database:

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 saya bukan string jadi saya mendapatkan Error Cannot implicity convert type 'string' to 'short' - person Kulpemovitz; 02.02.2012
comment
@Kulpemovitz Jika properti HouseType bertipe short, Anda bisa mengonversinya menjadi string dengan ToString(). Saya memperbarui contoh saya. - person Enrico Campidoglio; 02.02.2012
comment
Bagus. Tapi sekarang gagal kalau orangnya tidak punya rumah. tapi saya masih membutuhkan orang itu dalam hasilnya - person Kulpemovitz; 02.02.2012
comment
bagaimana menurutmu? orang.Rumah.Hitungan › 0 ? vs.person.Select(i =› i.HouseType.ToString()).Aggregate((saat ini, berikutnya) =› saat ini + , + berikutnya) : 0 - person Kulpemovitz; 02.02.2012
comment
@Kulpemovitz Kemungkinan besar Anda mendapatkan pengecualian yang menyatakan bahwa Sequence contains no elements ketika metode Select mengembalikan urutan kosong. Saya memperbarui jawaban saya. - person Enrico Campidoglio; 02.02.2012
comment
Saya akan tetap menggunakan sintaksis saya. Terima kasih - person Kulpemovitz; 02.02.2012
comment
Ini tidak berfungsi di linq ke entitas (baik .ToString dan .Aggregate tidak dapat diterjemahkan). Ini berfungsi di linq ke objek, tapi pertanyaannya tidak diberi tag seperti itu. - person John; 16.01.2014

Maksudmu sesuatu seperti?:

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