C# 实体框架核心

C# 实体框架核心,c#,entity-framework-core,C#,Entity Framework Core,我可以在EF.Net中做得很好,但在EFCore List<string> keyList = string.IsNullOrEmpty(keywords) ? new List<string>() : keywords.Split(' ').ToList(); collections = await db.ProductCollections .Where(m => m.Children.Count == 0 && (!keyList.A

我可以在
EF.Net
中做得很好,但在
EFCore

List<string> keyList = string.IsNullOrEmpty(keywords) ? new List<string>() : keywords.Split(' ').ToList();

collections = await db.ProductCollections
    .Where(m => m.Children.Count == 0 && (!keyList.Any() ? true : keyList.All(x => m.Name.Contains(x))))
    .ToListAsync();
所以我猜问题出在
keyList.All()
中。如何在EFCore中实现这一点

错误消息:

LINQ表达式'DbSet() .其中(p=>DbSet() 其中(p0=>EF.Property(p,“ID”)!=null&&object.Equals( objA:(object)EF.Property(p,“ID”), objB:(对象)EF.Property(p0,“ParentId”)) .Count()==0&&False | | uuu键列表0 .All(x=>p.Name.Contains(x))”无法翻译。以可翻译的形式重写查询,或切换 通过插入对“AsEnumerable”的调用来显式执行客户端评估, “AsAsyncEnumerable”、“ToList”或“ToListSync”。看见 了解更多信息


在执行查询之前,基于键列表构建查询的另一种方法

var keys = string.IsNullOrEmpty(keywords) ? Array.Empty<string>() : keywords.Split(' ');

var query = db.ProductCollections.Where(p => p.Children.Any() == false);
foreach (var key in keys)
{
     query = query.Where(p => p.Name.Contains(key));
}

var collections = await query.ToListAsync();
var keys=string.IsNullOrEmpty(关键字)?Array.Empty():关键字.Split(“”);
var query=db.ProductCollections.Where(p=>p.Children.Any()==false);
foreach(var键入键)
{
query=query.Where(p=>p.Name.Contains(key));
}
var collections=wait query.ToListAsync();

您如何知道它在EF Core中不工作?在EF6中,它将用C#而不是SQL进行查询,因此效率非常低,因为它会将整个表加载到内存中。始终首选
Array.Empty()
而不是
new T[]{}
new T[0]
因为它避免了堆分配。仍然遇到异常:
LINQ表达式'DbSet().Where(p=>DbSet().Where(p=>EF.Property(p,“ID”)!=null&&object.Equals(objA:(object)EF.Property(p,“ID”)、objB:(object)EF.Property(p,“ParentId”))。Any()==False。Where(p=>\uuuu keys\u 0.All(key=>p.Name.Contains(key)))”无法翻译…
@AlvinStefanus,请检查更新版本(复制粘贴问题),在这里,我们不使用
All
方法,而是为所有键创建查询。现在很好,但很不方便。Thanks@AlvinStefanus,视情况而定:),我发现它更方便读者,因为读者不需要深入研究多个嵌入式表达式来理解逻辑。
var keys = string.IsNullOrEmpty(keywords) ? Array.Empty<string>() : keywords.Split(' ');

var query = db.ProductCollections.Where(p => p.Children.Any() == false);
foreach (var key in keys)
{
     query = query.Where(p => p.Name.Contains(key));
}

var collections = await query.ToListAsync();