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

bf1o4zei  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(112)

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

TL;DR版本:

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

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

其中关键字是x1M3 N1 x并且值是x1M4 N1 x,
Name两列的Employees表,
我的EmployeeModel类是

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“得调用来显式切换到客户端计算.
我希望避免将其加载到内存中,因为结果可能会有几十万个。

了解我尝试做什么的更多上下文(也许有人可以看到这是否是一个x-y问题):

我有两个数据库数据库A有一个名为Companies的表和一个名为CompanyEmployees的连接表
数据库B中有一个名为Employees的表。Employee表中有一个Employee Id列,但没有Company Id列
然而,我的EmployeeModel类有一个雇员所属公司的CompanyId的属性。我试图加载一个雇员列表,并选择一个包含CompanyIdEmployeeModel
我试图实现的方法是将KeyValuePair的List加载到内存中,其中Key = CustomerEmployee.EmployeeIdValue = CustomerEmployee.CustomerId,然后使用该List查询另一个Db。(我没有看到任何替代方法来将KeyValuePair的List加载到内存中,尽管我显然不想这样做)

olqngx59

olqngx591#

此外,您可能对这部分有疑问:

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()

相关问题