LINQ:在两个单独的上下文的结果之间加入

时间:2015-07-10 18:46:36

标签: c# linq

我知道LINQ不支持标准“join”中的两个diff上下文。

话虽如此,我想要做的是,从“用户”和“联系”环境中汇集一份“员工”清单。 (这些是来自旧项目的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();

我需要联系人,其中'user.Contact_GUID'等于'contacts.Contact_GUID'。

我试过了:

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

无济于事......这只会带回一个联系人,但如果没有.FirstOrDefault()则无效。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

如果您在两个表中使用Contact_GUID,如果您在用户表中有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 };

参考:https://stackoverflow.com/a/2724018/1166597

答案 1 :(得分:1)

您可以使用以下代码:

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

答案 2 :(得分:1)

加入是可以在此处使用的选项之一,但您可以按如下方式修改当前解决方案:

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

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

答案 3 :(得分:0)

选项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();