استعلام LINQ مع المساع الفرعي كقيم مفصولة الفاصلة

StackOverflow https://stackoverflow.com/questions/2861202

  •  30-09-2019
  •  | 
  •  

سؤال

في طلبي ، يمكن أن يكون لدى الشركة العديد من الموظفين وقد يكون لكل موظف عناوين بريد إلكتروني متعددة.

يرتبط مخطط قاعدة البيانات الجداول مثل هذا:

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)
    };
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top