2017-04-11 208 views
1

我想知道如何改变这个实体框架的linq查询。实体框架LINQ查询

我有以下的列表A:项目(VARCHAR),代码(VARCHAR),评估(整数)

代码数据是分层 - 即10011,10012,10013个...等都是儿童代码1001再如123001,123002,12300,12301是代码儿童1230

我想根据项目的查询,然后再通过代码的每一行,并评估检索所有它的孩子= 0(例如)

我写了下面的代码,但没有给出正确的结果:

var result = db.tableA.AsQueryable(); 
var tempResult = result.Where(p => p.project.Equals(ProjectValue)); 
result = tempResult.Where(c => c.Code.StartsWith(c.Code) && c.assess== 0); 

上面的查询没有返回代码的孩子在那里的项目等于“ProjectValue”

+0

什么是实际存储在项目中?不要孩子分享同一个项目?!你也在说选择'c => c.Code.StartsWith(c.Code)'这总是所有的数据,因为你正在对它进行自我检查。你需要定义你正在寻找什么c.Code – Armin

+0

没有孩子不共享同一个项目。最初我想查询他们的项目='ABC'的所有项目,那么我想要从主表中检索所有子代码,其中评估等于0 – ibrahim

+0

下面更新的答案应该为你做 – Armin

回答

1

你需要知道哪些记录是父母为了做到这一点,如果没有你的病情StartsWith将永远是真实的,因为你有孩子,在tempResult父。

我假定具有最小长度的代码是父母。 选择父母之后,您只需记录以父代码开头但与父代码长度不同的所有记录。

var result = db.tableA.AsQueryable(); 
var minLength = result.Select(t => t.Code.Length).Min(); 
var tempResult = result.Where(p => p.project.Equals(ProjectValue) && p.Code.Length == minLength); 
result = result.Where(c => tempResult.Any(d => c.Code.StartsWith(d.Code)) && c.assess== 0 && c.project.Equals(ProjectValue) && c.Code.Length != minLength); 
0

我能想到的,现在最接近的事,与你在你的问题已经给了上下文的量将最终是:

var result = db.tableA.AsQueryable(); 
var tempResult = result.Where(p => p.project.Equals(ProjectValue)).select(p => p.code); 
result = result.Where(c => tempResult.contains(c.Code.substring(0, 4)) && c.assess== 0 && c.project.Equals(ProjectValue)); 
+0

tempResult.contains(c.Code。子字符串(0,4))将始终为true,当c.project.Equals(ProjectValue)为true时 –