استعلام LINQ مع المساع الفرعي كقيم مفصولة الفاصلة
سؤال
في طلبي ، يمكن أن يكون لدى الشركة العديد من الموظفين وقد يكون لكل موظف عناوين بريد إلكتروني متعددة.
يرتبط مخطط قاعدة البيانات الجداول مثل هذا:
Company -> ComplemployexRef -> الموظف ->
أنا أستخدم إطار عمل الكيان وأريد إنشاء استعلام LINQ الذي يعيد اسم الشركة وقائمة مفصولة بفاصلة عناوين البريد الإلكتروني الخاصة به. إليكم الاستعلام الذي أحاوله:
from c in Company
join ex in CompanyEmployeeXref on c.Id equals ex.CompanyId
join e in Employee on ex.EmployeeId equals e.Id
join ax in EmployeeAddressXref on e.Id equals ax.EmployeeId
join a in Address on ax.AddressId equals a.Id
select new {
c.Name,
a.Email.Aggregate(x=>x + ",")
}
Desired Output:
"Company1", "a@company1.com,b@company1.com,c@company1.com"
"Company2", "a@company2.com,b@company2.com,c@company2.com"
...
أعلم أن هذا الرمز خاطئ ، أعتقد أنني أفتقد مجموعة ، لكنه يوضح النقطة. لست متأكدًا من بناء الجملة. هل هذا ممكن؟ شكرا على اي مساعدة.
المحلول
ها هي الآن حل المشكلة:
from c in Company
join ex in CompanyEmployeeXref on c.Id equals ex.CompanyId
join e in Employee on ex.EmployeeId equals e.Id
join ax in EmployeeAddressXref on e.Id equals ax.EmployeeId
join a in Address on ax.AddressId equals a.Id
group a.Email by new {c.Name} into g
select new {
Company=g.Key.Name,
Email=g.Select(e=>e).Distinct()
}
).ToList()
.Select(l=>
new {
l.Name,
Email=string.Join(",", l.Email.ToArray())
}
)
نصائح أخرى
من الصعب في الواقع القيام بذلك في LINQ Pure إلى SQL (أو إطار الكيان ، أيهما تستخدمه) لأن SQL Server نفسه لا يحتوي على أي مشغل إجمالي يمكنه إنتاج قائمة محددة فاصلة ، لذلك ليس لديه طريقة للتحويل هذا البيان بأكمله في استعلام واحد. يمكن أن أعطيك "مجموعة واحدة" إلى إجابة SQL ، لكنها في الواقع لن تقدم لك أداءً جيدًا للغاية ، ولست متأكدًا مما إذا كان سيعمل على الإطلاق في EF.
إنه أقصى ولكن لا يزال أفضل إذا قمت فقط بربط منتظم ، وتحقق النتائج ، ثم قم بتسلسلك باستخدام LINQ إلى الكائنات:
var rows =
(from c in Company
join ex in CompanyEmployeeXref on c.Id equals ex.CompanyId
join e in Employee on ex.EmployeeId equals e.Id
join ax in EmployeeAddressXref on e.Id equals ax.EmployeeId
join a in Address on ax.AddressId equals a.Id
select new
{
c.Name,
a.Email
}).AsEnumerable();
var emails =
from r in rows
group r by r.Name into g
select new
{
Name = g.Key,
Emails = g.Aggregate((x, y) => x + "," + y)
};