解决此问题的最佳方法是什么?
TL;DR版本:
使用LINQ和EntityFramework,我尝试将KeyValuePair
的List
传递给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
的属性。我试图加载一个雇员列表,并选择一个包含CompanyId
的EmployeeModel
我试图实现的方法是将KeyValuePair
的List加载到内存中,其中Key = CustomerEmployee.EmployeeId
和Value = CustomerEmployee.CustomerId
,然后使用该List查询另一个Db。(我没有看到任何替代方法来将KeyValuePair
的List加载到内存中,尽管我显然不想这样做)
1条答案
按热度按时间olqngx591#
此外,您可能对这部分有疑问:
因为CompanyId是一个长整型,而Linq表达式的结果是一个IEnumerable。如果你确定你有一个结果并且只有一个,那么你可以用途: