简体   繁体   English

LINQ查询以按孩子查找父母

[英]LINQ query for finding Parent by Child

I'm new to EF\\LINQ. 我是EF \\ LINQ的新手。 How to rewrite such sql query in LINQ: 如何在LINQ中重写此类sql查询:

SELECT Pacient_ID FROM VisitDates WHERE ID in 
(SELECT visitDate_ID from    Reviews WHERE comments LIKE N'%name%')

Problem is that I can't access colums created by EF in LINQ query (visitDate_ID, Pacient_ID) I'v tried to do something like this, but it is very slow: 问题是我无法在LINQ查询中访问由EF创建的列(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;
                    }
                }
            }

Thanks! 谢谢!

replace the the nesting of foreach by this line : 用以下这一行替换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();

This will do what your SQL query asked for: 这将执行您的SQL查询所要求的:

var results=db.VisitDates
  .Where(vd=>vd.Reviews.Any(r=>r.comments.Contains("name")))
  .Select(vd=>vd.Pacient_ID);

.ToLower() stuff isn't required (usually) because the comparison is handled by the database, which by default does case insensitive comparisons, and adding them may cause the query to run significantly slower. 通常不需要.ToLower()东西,因为比较是由数据库处理的,默认情况下,它不区分大小写,并且添加它们可能会导致查询运行明显变慢。

If you want pacients, then it'd be: 如果您想要专家,那就是:

var results=db.Pacients
  .Where(p=>p.VisitDates.Any(vd=>vd.Reviews.Any(r=>r.comments.Contains("name"))));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM