C# Linq语句需要优化

C# Linq语句需要优化,c#,linq,linq-to-sql,lambda,C#,Linq,Linq To Sql,Lambda,我编写了以下代码: //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 =

我编写了以下代码:

//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();
//从数据库获取用户
var tmpuser=\u db.aspnet\u Users.First(q=>q.UserName==user.Identity.Name);
//列出与Verbond的直接连接
列表verb1=tmpuser.UsersVerbondens
.其中(q=>q.Schooljaar.Sch_Schooljaar==schooljaarparam)
.选择(q=>q.Verbond)
.ToList();
//列出连接的factureEverBonden
列表verb2=tmpuser.usersFactureEverBondens
.其中(q=>q.Schooljaar.Sch_Schooljaar==schooljaarparam)
.选择(q=>q.FacturateEverBonden)
.ToList();
//循环浏览FacturateEverBonden并将其详细内容添加到第一个列表中
foreach(在verb2中制作Everbonden v){
verb1.AddRange(v.Verbonds);
}
//列一个不同的清单
列表测试=verb1.Distinct().ToList();
因此,用户可以连接到0或更多的
factureeverbonden
,也可以连接到
verbond

一个
factureEverBonden
可以有一个或多个
verbond

我需要的是一个列表,其中列出了用户直接或间接通过
facturiateverbonden
连接到的所有
verbond


我的代码可以工作,但我认为它不是很有效。有没有让它更干净的提示?

您的查询不是很准确。这里有一个潜在的改进:

           //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
成为它最后做的事情,整个计算可以在数据库中完成,避免了所有中间列表。

您的查询不是很简单。这里有一个潜在的改进:

           //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
成为它最后做的事情,整个计算可以在数据库中完成,避免所有中间列表。

您的性能问题就在这里。每个AddRange调用都将枚举v.Verbonds,每个调用都是数据库往返

//loop through the facturatieverbonden and add their verbonds to the first list 
foreach (FacturatieVerbonden v in verb2) { 
    verb1.AddRange(v.Verbonds); 
} 
要解决此问题,请执行以下操作:

//query the connected Facturatieverbonden 
IQueryable<FacturatieVerbonden> verbQuery2 = tmpuser.UsersFacturatieVerbondens 
  .Where(q => q.Schooljaar.Sch_Schooljaar == schooljaarparam) 
  .Select(q => q.FacturatieVerbonden);

verb1.AddRange(verbQuery2.SelectMany(fv => fv.Verbonds));
//查询连接的factureEverBonden
IQueryable verbQuery2=tmpuser.usersFactureEverBondens
.其中(q=>q.Schooljaar.Sch_Schooljaar==schooljaarparam)
.选择(q=>q.FacturateEverBonden);
verb1.AddRange(verbQuery2.SelectMany(fv=>fv.Verbonds));

仍然有很大的空间来提高性能,但至少这解决了严重的问题。您可以很容易地观察到10倍的加速。

您的性能问题就在这里。每个AddRange调用都将枚举v.Verbonds,每个调用都是数据库往返

//loop through the facturatieverbonden and add their verbonds to the first list 
foreach (FacturatieVerbonden v in verb2) { 
    verb1.AddRange(v.Verbonds); 
} 
要解决此问题,请执行以下操作:

//query the connected Facturatieverbonden 
IQueryable<FacturatieVerbonden> verbQuery2 = tmpuser.UsersFacturatieVerbondens 
  .Where(q => q.Schooljaar.Sch_Schooljaar == schooljaarparam) 
  .Select(q => q.FacturatieVerbonden);

verb1.AddRange(verbQuery2.SelectMany(fv => fv.Verbonds));
//查询连接的factureEverBonden
IQueryable verbQuery2=tmpuser.usersFactureEverBondens
.其中(q=>q.Schooljaar.Sch_Schooljaar==schooljaarparam)
.选择(q=>q.FacturateEverBonden);
verb1.AddRange(verbQuery2.SelectMany(fv=>fv.Verbonds));

仍然有很大的空间来提高性能,但至少这解决了严重的问题。你可以很容易地观察到10倍的速度。

好主意,但小问题:q.Verbond和vf.Verbonds(复数)是不同的类型。大卫B:这就是用外语编程的问题——很难判断什么时候没有意义。我现在有吗?好主意,但有个小问题:q.Verbond和vf.Verbonds(复数)是不同的类型。大卫B:这就是用外语编程的问题——很难说什么时候没有意义。我现在有吗?