2017-05-08 89 views
-2

下面的代码给了我需要的结果,但任何人都可以建议如何更好地编写它?我相信有一个更有效的方法来做到这一点。 谢谢。整理lambda表达式

private bool IsLocation(Guid _vID, Guid OrganisationId) 
{ 
    var vehicle = _vehilceRepository.GetSingle(c => c.vehicleId == _vID); 
    var clients = _clientRepository.GetList(c => c.OrganisationID == OrganisationId); 

    foreach (var client in clients) 
    { 
     var locations = _LocationRepository.GetList(c => c.ClientID == client.ClientID); 
     if (locations.Count > 0) 
     { 
      foreach (var location in locations) 
      { 
       if (location.LocationId == vehicle.LocationID) 
       { 
        return true; 
       } 
      } 
     } 
    } 
    return false; 
} 
+0

我建议为Visual Studio安装'ReSharper'。它会帮助你处理这些事情。 – ThePerplexedOne

+0

你是什么意思:“更有效的方式”?更快的代码执行(实际上是效率)或更少的代码写入? –

+1

回复@AdamJachocki所说的 - 理想的*在这里将能够做一个单一的操作(而不是N + 2);但是,这并不一定可以通过存储库API随时获得。这就是为什么当性能是一个因素时,我通常更喜欢*非常特殊的方法 - 也就是说,我可以基本上编写一些SQL,通过数据库的连接直接执行*,只传递两个GUID,并返回1或0 。所以我想这里的理想是:'返回_someRepo.IsVehicleInAnyClientLocation(_vID,OrganisationId);' –

回答

2
var vehicle = _vehilceRepository.GetSingle(c => c.vehicleId == _vID); 
var clients = _clientRepository.GetList(c => c.OrganisationID == OrganisationId); 
return clients.SelectMany(client => _LocationRepository.GetList(
       c => c.ClientID == client.ClientID)) 
     .Any(location => location.LocationId == vehicle.LocationID); 

+0

OP要求更有效的方式。 LINQ永远不会像标准循环那样高效 –

+6

@Adam oh * please * ...当你完成n + 2版本库操作时,它完全不相关**你如何遍历它,假装你再次担心效率是愚蠢的。所以在我看来,这留下了另一种效率:更少,更简单的代码的效率。 OP询问“写得更好”和“整理” - 我认为这有一个公平的刺伤。有趣的是,我可能是第一个使用uglify代码进行性能测试的人,但那时我正在处理纯粹的内存数据。去数据库:忘了其他的一切。 –

+2

@AdamJachocki目前尚不清楚他的意思是什么,因为标题 – Slai