2011-08-18 4 views
0

괜찮 았던 linq 쿼리가 있지만 프로젝트에서 StyleCop을 실행하면 다음 오류가 생성됩니다. "CA1505 : Microsoft.Maintainability : 다시 쓰기 또는 리팩터링 유지 보수 지수 (MI)를 높이기위한 유형의 방법 "이라고 설명했다. 나는 쿼리의 일부를 제거하고 그 오류를 수정 발견했다. 문제는 쿼리가 너무 길어서 CA1505 오류를 없애기 위해 쿼리를 줄이는 방법을 찾고 있습니다. 여기에서의 문제는 데이터가 5 개의 주 테이블에 상주한다는 것인데, 이에 상응하는 SQL은 기본적으로 5 개의 모든 UNION 문입니다. 어떤 제안?linq 쿼리를 수행하면 "CA1505 : Microsoft.Maintainability"오류가 발생합니다.

public List<ExpiringItemModel> GetByDaysToExpire(int days) 
    { 
     var int1 = days - 30; 
     var int2 = days - 16; 
     var int3 = days - 0; 

     var query = (
      from outlet in _modelContext.Outlets 
      join outletcommunicationmethod in _modelContext.OutletCommunicationMethods on 
       new { Id = outlet.Id } 
       equals new { Id = outletcommunicationmethod.OutletId } 
      join outletcarpermitagent in _modelContext.outletcarpermitagents on 
       new { Id = outlet.Id } equals 
       new { Id = outletcarpermitagent.OutletId } 
      join outlettype in _modelContext.OutletTypes on 
       new { OutletTypeId = outletcarpermitagent.OutletTypeId } equals 
       new { OutletTypeId = outlettype.Id } 
      where 
       (outletcommunicationmethod.CommunicationMethodId == 1 
       && 
       SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
             outletcarpermitagent.BondExpirationDate) > 0) && 

       (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
             outletcarpermitagent.BondExpirationDate) == days || 
       (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
             outletcarpermitagent.BondExpirationDate) == 30) || 
       (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
             outletcarpermitagent.BondExpirationDate) == 14)) 

      select new ExpiringItemModel 
      { 
       Id = (Int32)outletcarpermitagent.Id, 
       AgentType = outlettype.Value, 
       Email = outletcommunicationmethod.Value, 
       BondExpirationDate = (DateTime)outletcarpermitagent.BondExpirationDate 
      } 
      ).Concat 
      (
       from outlet_1 in _modelContext.Outlets 
       join outletcommunicationmethod_1 in _modelContext.OutletCommunicationMethods on 
        new { Id = outlet_1.Id } equals new { Id = outletcommunicationmethod_1.OutletId } 
       join outlettruckpermitagent in _modelContext.outlettruckpermitagents on 
        new { Id = outlet_1.Id } equals new { Id = outlettruckpermitagent.OutletId } 
       join outlettype_1 in _modelContext.OutletTypes on 
        new { OutletTypeId = outlettruckpermitagent.OutletTypeId } equals 
        new { OutletTypeId = outlettype_1.Id } 
       where 
        (outletcommunicationmethod_1.CommunicationMethodId == 1 
        && 
        SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outlettruckpermitagent.BondExpirationDate) > 0) && 

        (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outlettruckpermitagent.BondExpirationDate) == days || 
        (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outlettruckpermitagent.BondExpirationDate) == 30) || 
        (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outlettruckpermitagent.BondExpirationDate) == 14)) 

       select new ExpiringItemModel 
       { 
        Id = (Int32)outlettruckpermitagent.Id, 
        AgentType = outlettype_1.Value, 
        Email = outletcommunicationmethod_1.Value, 
        BondExpirationDate = (DateTime)outlettruckpermitagent.BondExpirationDate 
       } 
      ).Concat 
      (
       from outlet_2 in _modelContext.Outlets 
       join outletcommunicationmethod_2 in _modelContext.OutletCommunicationMethods on 
        new { Id = outlet_2.Id } equals new { Id = outletcommunicationmethod_2.OutletId } 
       join outletcyclepermitagent in _modelContext.outletcyclepermitagents on new { Id = outlet_2.Id } equals 
        new { Id = outletcyclepermitagent.OutletId } 
       join outlettype_2 in _modelContext.OutletTypes on new { OutletTypeId = outletcyclepermitagent.OutletTypeId } 
        equals new { OutletTypeId = outlettype_2.Id } 
       where 
        (outletcommunicationmethod_2.CommunicationMethodId == 1 
        && 
        SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outletcyclepermitagent.BondExpirationDate) > 0) && 

        (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outletcyclepermitagent.BondExpirationDate) == days || 
        (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outletcyclepermitagent.BondExpirationDate) == 30) || 
        (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outletcyclepermitagent.BondExpirationDate) == 14)) 

       select new ExpiringItemModel 
       { 
        Id = (Int32)outletcyclepermitagent.Id, 
        AgentType = outlettype_2.Value, 
        Email = outletcommunicationmethod_2.Value, 
        BondExpirationDate = (DateTime)outletcyclepermitagent.BondExpirationDate 
       } 
       ).Concat 
       (
       from outlet_3 in _modelContext.Outlets 
       join outletcommunicationmethod_3 in _modelContext.OutletCommunicationMethods on 
        new { Id = outlet_3.Id } equals new { Id = outletcommunicationmethod_3.OutletId } 
       join outletscooteragent in _modelContext.outletscooteragentAgents on 
        new { Id = outlet_3.Id } equals 
        new { Id = outletscooteragent.OutletId } 
       join outlettype_3 in _modelContext.OutletTypes on 
        new { OutletTypeId = outletscooteragent.OutletTypeId } 
        equals new { OutletTypeId = outlettype_3.Id } 
       where 
        (outletcommunicationmethod_3.CommunicationMethodId == 1 
        && 
        SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outletscooteragent.BondExpirationDate) > 0) && 

        (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outletscooteragent.BondExpirationDate) == days || 
        (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outletscooteragent.BondExpirationDate) == 30) || 
        (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outletscooteragent.BondExpirationDate) == 14)) 

       select new ExpiringItemModel 
       { 
        Id = (Int32)outletscooteragent.Id, 
        AgentType = outlettype_3.Value, 
        Email = outletcommunicationmethod_3.Value, 
        BondExpirationDate = (DateTime)outletscooteragent.BondExpirationDate 
       } 
       ).Concat 
       (
       from outlet_4 in _modelContext.Outlets 
       join outletcommunicationmethod_4 in _modelContext.OutletCommunicationMethods on 
        new { Id = outlet_4.Id } equals new { Id = outletcommunicationmethod_4.OutletId } 
       join outletoffroadagent in _modelContext.outletoffroadagentAgents on new { Id = outlet_4.Id } equals 
        new { Id = outletoffroadagent.OutletId } 
       join outlettype_4 in _modelContext.OutletTypes on new { OutletTypeId = outletoffroadagent.OutletTypeId } 
        equals new { OutletTypeId = outlettype_4.Id } 
       where 
        (outletcommunicationmethod_4.CommunicationMethodId == 1 
        && 
        SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outletoffroadagent.BondExpirationDate) > 0) && 

        (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outletoffroadagent.BondExpirationDate) == days || 
        (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outletoffroadagent.BondExpirationDate) == 30) || 
        (SqlFunctions.DateDiff("day", SqlFunctions.GetDate(), 
              outletoffroadagent.BondExpirationDate) == 14)) 

       select new ExpiringItemModel 
       { 
        Id = (Int32)outletoffroadagent.Id, 
        AgentType = outlettype_4.Value, 
        Email = outletcommunicationmethod_4.Value, 
        BondExpirationDate = (DateTime)outletoffroadagent.BondExpirationDate 
       } 
       ); 

      return query.ToList(); 
     } 

답변

0

각 concat을 자체 쿼리로 분리 할 수 ​​있습니다. 예를 들어

var query1 = from outlet in _modelContext.Outlets 
       ...; 

var query2 = from outlet in _modelContext.Outlets 
       ...; 


var fullquery = query1.Concat(query2).Concat(...); 
관련 문제