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