繁体   English   中英

将 KeyValuePairs 列表传递给 LINQ 查询并选择与实体 ID 匹配的键的值

[英]Passing List of KeyValuePairs to LINQ query and selecting the Value for the Key that matches the entity's Id

解决这个问题的最佳方法是什么?

TL;DR 版本:

使用 LINQ 和 EntityFramework 我试图将KeyValuePairList传递给 LINQ 查询,然后对于 ID 与列表中的任何键匹配的每个实体,选择具有该键值的新列。

所以如果我的KeyValuePair

List<KeyValuePair(int, long)> keyValuePairs = new() 
{
    new(1, 10),
    new(2, 20),
    new(3, 30)
}

其中键是EmployeeId ,值是CompanyId

我正在查询一个Employees表,它有两列, IdName

我的EmployeeModel class 是

public int Id;
public int Name;
public long CompanyId;

我想做这样的事情:

var keys = keyValuePairs.Select(x => x.Key);

IQueryable<EmployeeModel> EmployeeModels = Db.Employees
    .Where(e => keys.Contains(p.Id))
    .Select(e => new EmployeeModel 
    {
        Id = e.Id,
        Name = e.Name,
        CompanyId = keyValuePairs.Where(x => x.Key == e.Id).Select(x => x.Value).First()
    });

目前我得到这个例外:

无法翻译 LINQ 表达式“x”。 以可翻译的形式重写查询,或通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用显式切换到客户端评估。

我想避免将其加载到 memory 中,因为结果可能有数十万。 另外,我需要将结果传递给需要 IQueryable 的方法

了解我正在尝试做什么的更多上下文(也许有人可以看到这是否是 xy 问题):

我有两个数据库数据库 A 有一个名为 Companies 的表和一个名为 CompanyEmployees 的连接表

数据库 B 有一个名为 Employees 的表 Employee 表有一个 Employee Id 列,但没有 Company Id 列

但是,我的EmployeeModel class 具有员工所属公司的CompanyId的道具。 我正在尝试加载员工列表,并选择包含CompanyIdEmployeeModel

我试图完成的方法是将KeyValuePair的列表加载到 memory 中,其中Key = CustomerEmployee.EmployeeIdValue = CustomerEmployee.CustomerId ,然后使用该列表查询另一个 Db。 (我没有看到将KeyValuePair列表加载到 memory 的任何替代方法,即使我显然不想这样做)

你也可能对这部分有问题:

CompanyId = keyValuePairs.Where(x => x.Key == e.Id).Select(x => x.Value)

由于 CompanyId 很长,并且您的 Linq 表达式的结果是 IEnumerable。 如果您确定只有一个结果,那么您可以使用:

CompanyId = keyValuePairs.Where(x => x.Key == e.Id).Select(x => x.Value).First()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM