用于按子查找父节点的LINQ查询
本文关键字:LINQ 查询 父节点 查找 用于 | 更新日期: 2023-09-27 17:51:06
我是EF'LINQ的新手。如何在LINQ中重写这样的sql查询:
SELECT Pacient_ID FROM VisitDates WHERE ID in
(SELECT visitDate_ID from Reviews WHERE comments LIKE N'%name%')
问题是我无法访问EF在LINQ查询(visitDate_ID, Pacient_ID)中创建的列我试过这样做,但是太慢了:
List<Pacient> found = new List<Pacient>();
List<Pacient> pacients = db.Pacients.Include(p => p.visits.Select(w => w.reviews)).ToList();
bool k = false;
foreach (Pacient p in pacients)
{
foreach (VisitDate date in p.visits)
{
foreach (Review r in date.reviews)
{
if (r.comments.ToLower().Contains(name.ToLower()))
{
found.Add(p);
k = true;
break;
}
}
if (k)
{
k = false;
break;
}
}
}
谢谢!
这将执行您的SQL查询请求:
var results=db.VisitDates
.Where(vd=>vd.Reviews.Any(r=>r.comments.Contains("name")))
.Select(vd=>vd.Pacient_ID);
(通常)不需要. tolower()之类的东西,因为比较是由数据库处理的,默认情况下,数据库会进行不区分大小写的比较,添加它们可能会导致查询运行明显变慢。
如果你想要病人,那么它应该是:
var results=db.Pacients
.Where(p=>p.VisitDates.Any(vd=>vd.Reviews.Any(r=>r.comments.Contains("name"))));
用这一行替换foreach的嵌套:
var found =(from p in pacients where p.visits.Any(date=>date.reviews.Any
(r=>r.comments.ToLower().Contains(name.ToLower()))
select p).ToList();