我写了下面的代码:
//get the user from the DB
var tmpuser = _db.aspnet_Users.First(q => q.UserName == user.Identity.Name);
//list the direct connections to Verbond
List<Verbond> verb1 = tmpuser.UsersVerbondens
.Where(q => q.Schooljaar.Sch_Schooljaar == schooljaarparam)
.Select(q => q.Verbond)
.ToList();
//list the connected Facturatieverbonden
List<FacturatieVerbonden> verb2 = tmpuser.UsersFacturatieVerbondens
.Where(q => q.Schooljaar.Sch_Schooljaar == schooljaarparam)
.Select(q => q.FacturatieVerbonden)
.ToList();
//loop through the facturatieverbonden and add their verbonds to the first list
foreach (FacturatieVerbonden v in verb2) {
verb1.AddRange(v.Verbonds);
}
//make a distinct list
List<Verbond> test = verb1.Distinct().ToList();
因此,用户可以连接到 0 个或多个 facturatieverbonden
,也可以连接到 verbond
。
一个 facturatieverbonden
可以有一个或多个 verbond
在其下。
我需要的是用户直接或通过 facturatieverbonden
间接连接的所有 verbond
的列表。
我的代码有效,但我认为它不是很有效。有什么让它更干净的提示吗?
最佳答案
您的查询不是很 LINQy。这是一个潜在的改进:
//list the direct connections to Verbond
var test = (from q in tmpuser.UsersVerbondens
where q.Schooljaar.Sch_Schooljaar == schooljaarparam
select q.Verbond)
//return distinct values
.Union
//list the connected Facturatieverbonden
(from q in tmpuser.UsersFacturatieVerbondens
where q.Schooljaar.Sch_Schooljaar == schooljaarparam
from v in q.FacturatieVerbonden.Verbonds
select v)
//return a List
.ToList();
通过将 ToList
作为它做的最后一件事,整个计算可以在数据库中完成,避免所有中间列表。
关于c# - Linq 语句需要优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4441972/