用于按子查找父节点的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;
                    }
                }
            }

谢谢!

用于按子查找父节点的LINQ查询

这将执行您的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();