减少 Linq 联接的详细程度

本文关键字:程度 Linq 减少 | 更新日期: 2023-09-27 18:35:41

我目前正在弄清楚如何用实体框架和 Linq 替换我们所有的跨数据库联接,我已经设法让我的代码的一部分正常工作,但真正让它有点烦人的是联接的冗长和复杂性。有没有办法简化代码,或者我是否坚持使用冗长、冗长、凌乱的代码?

举个例子:

using (var context = new CustomerContext(CustomerID))
using (var e = new eContext())
{
    var globalUserList = e.GlobalLoginCustomerBridges
        .Join(e.GlobalLogins,
            glcb => glcb.glcbr_gl_id,
            gl => gl.gl_id,
            (glcb, gl) => new { glcb, gl })
        .Where(n => n.glcb.glcbr_customer_id == CustomerID)
        .Select(n => new User2
        {
            ID = (int)n.glcb.glcbr_user_id,
            GlobalLogin = n.gl.gl_login_name,
            GUID = n.gl.gl_GUID
        }).ToList();
    var customer = e.Customers
        .Join(e.DatabaseConnectionStrings,
        c => c.DatabaseConnectionID,
        d => d.DatabaseConnectionID,
        (c, d) => new { c, d })
        .Select(n => new Customer2
        {
            ID = n.c.CustomerID,
            Name = n.c.CustomerName,
            DatabaseConnectionName = n.d.DatabaseConnectionName,
            DatabaseConnectionString = n.d.DatabaseConnectionString1,
            GUID = n.c.cust_guid,
        }).ToList().FirstOrDefault(n => n.ID == CustomerID);
    var orgs = context.Organizations
        .Select(o => new Organization2
        {
            ID = o.org_id,
            Name = o.org_name,
        }).ToList();
    var users = context.Users
        .Select(n => new User2
        {
            ID = n.UserID,
            FirstName = n.UserFirstName,
        }).ToList();
    var userList = users
        .Join(globalUserList,
            u => u.ID,
            gl => gl.ID,
            (u, gl) => new { u, gl })
        .Join(context.OrganizationObjectBridges,
            u => u.u.ID,
            oob => oob.oob_object_id,
            (u, oob) => new { u, oob })
            .Where(o => o.oob.oob_object_type_id == 9)
        .Select(n => new User2
        {
            ID = n.u.u.ID,
            GlobalLogin = n.u.gl.GlobalLogin,
            FirstName = n.u.u.FirstName,
            GUID = n.u.gl.GUID,
            Customer = customer,
            Organization = orgs.FirstOrDefault(o => o.ID == n.oob.oob_org_id)
        }).Where(n => !isDisabled != null && n.Disabled == isDisabled).ToList();
    return userList;
}

在上面的代码片段中,我删除了 ~80% 的代码,因为其中大部分只是字段映射,但它比显示的内容要长得多。

减少 Linq 联接的详细程度

似乎前 2 个查询不需要联接,因为它们属于同一个数据库。您不能改用导航属性吗?请记住,仅在没有物理(导航属性)关系的对象之间使用联接。

关于最后一个查询,您可以使用 linq 查询而不是链方法(在我看来,这使得代码更具可读性)。它会是这样的:

var userList = from user in users
                join gul in globalUserList on user.ID = gul.ID
                join oob in context.OrganizationObjectBridges on user.ID = oob.oob_object.id
                where oob.oob_object_type_id == 9
                select new User2
                {
                    ID = user.ID,
                    GlobalLogin = gul.GlobalLogin,
                    FirstName = user.FirstName,
                    GUID = gul.GUID,
                    Customer = customer,
                    Organization = orgs.FirstOrDefault(o => o.ID == n.oob.oob_org_id)
                };

未经测试的代码,我相信它不起作用。我只是给你一些想法。