LINQ:连接两个独立上下文的结果

本文关键字:独立 两个 上下文 结果 连接 LINQ | 更新日期: 2023-09-27 18:02:13

我知道LINQ在一个标准的'join'中不支持两个不同的上下文。

说了这么多,我想做的是,从"用户"answers"联系人"上下文中拉出一个"雇员"的列表。(这些是来自旧项目的edmx,我不打算乱用。)

问题是,"用户"是我想要获得的WHO,但他们的人口统计数据存在于"联系人"中。下面是当前的两个LINQ:

        var users = _pets_dc.Users
            .Select(p => p)
            .Where(x => x.Active)
            .ToList();
        var contacts = _poems_dc.Contacts
            .Select(p => p)
            .Where(x => x.Active)
            .ToList();

我需要联系人 where 'user。Contact_GUID' = 'contacts.Contact_GUID'.

I have try:

var query = contacts
    .Where(x => x.Contact_GUID == users
        .Select(y => y.Contact_GUID)
        .FirstOrDefault());

to no avail…这只能带回一个触点,但没有.FirstOrDefault()将无法工作。什么好主意吗?

LINQ:连接两个独立上下文的结果

如果您在两个表中都使用Contact_GUID,如果您在users表中有FK,请尝试使用include的第一个查询

var users = _pets_dc.Users.Include("Contacts")
            .Where(x => x.Active)
            .ToList();

你可以尝试以下方法:

var joined = from list1 in users 
                 join list2 in contacts
                 on list1.Contact_GUID equals list2.Contact_GUID 
                 select new { list1, list2 };

ref: https://stackoverflow.com/a/2724018/1166597

可以使用下面的代码:

  var result = users.Select(e => contacts.Where(x => x.Contact_GUID == e.Contact_GUID));

join是这里可以使用的选项之一,但是您可以这样修改当前的解决方案:

var query = contacts
    .Where(x => users
               .Select(y => y.Contact_GUID).Contains(x.Contact_GUID)
           ).FirstOrDefault());

Contains将检查给定列表中的Guid,在原始解决方案中,您将Guid与List<Guid>进行比较,这将失败

选项1:

var query = from person in users
                    join contact in contacts on person.Contact_GUID equals contact.GUID into employees
                    from employee in employees.DefaultIfEmpty()
                    select new Employee() { User = person, Demographic = employee.Demographic };

var employees = query.ToList();

选项2:

var query = from person in users
                    join contact in contacts on person.Contact_GUID equals contact.GUID into employees
                    from employee in employees.DefaultIfEmpty()
                    select new { person.FirstName, person.LastName, employee.Demographic };

var employees = query.ToList();