簡體   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