我有兩個模型:
public class Employee
{
public int Id { get; set; }
public IList<Skill> { get; set; }
}
public class Skill
{
public int Id { get; set; }
}
我有技能 ID 串列的過濾器,該員工應包含:
public class Filter
{
public IList<int> SkillIds { get; set; }
}
我想撰寫查詢來獲取所有員工,這些員工擁有過濾器中的所有技能。
我試過:
query.Where(e => filter.SkillIds.All(id => e.Skills.Any(skill => skill.Id == id)));
和:
query = query.Where(e => e.Skills
.Select(x => x.Id)
.Intersect(filter.SkillIds)
.Count() == filter.SkillIds.Count);
但結果我得到例外說無法翻譯查詢。
uj5u.com熱心網友回復:
在 sql server 端運行這樣的查詢將是一項困難的任務,即使不是不可能的任務。這是因為要在 SQL 端執行此操作,您需要將每組員工技能分組到一行中,該行需要為skills表中列出的每個技能創建一個新列。SQL Server 并不是真正用來處理傳遞給查詢的一組未知列的分組。雖然這種查詢在技術上是可行的,但通過像 ef core 這樣的模型系結框架可能不是很容易做到。
使用以下內容在 .net 端執行此操作會更容易:
var employees = _context.Employees.Include(x=>x.Skill).ToList();
var filter = someFilter;
var result = employees.Where(emp => filter.All(skillID=> emp.skills.Any(skill=>skill.ID == skillID))).ToList()
uj5u.com熱心網友回復:
此解決方案有效:
foreach (int skillId in filter.SkillIds)
{
query = query.Where(e => e.Skills.Any(skill => skill.Id == skillId));
}
我不確定它的性能,但在少量資料的情況下作業得非常快。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/341474.html
標籤:C# asp.net 。网 .net核心 实体框架核心
上一篇:使用復雜物件的嵌套asp中繼器
