2013-07-31 1 views
1

EF를 사용하는 콘솔 응용 프로그램을 만들었습니다. 그것은 매우 잘 작동하지만 리팩터링 될 수 있다는 것을 알고 있습니다. 여기C# EF 코드를 리팩토링하는 방법은 무엇입니까?

CABEntities caContext = new CAEntities(); 
USEntities usContext = new USEntities(); 

var query = caContext.CA_companies 
    .Where(c => 
     c.coverage_status.Equals("active")) 
    .Select(c => new DatapullFields.Datapull 
    { 
     Ticker = c.ticker.Trim(), 
     Exchange = c.primary_exchange.Trim(), 
     CompanyName = c.company_name.Trim() 
    }); 

CreateCSVFile.WriteToCSVFile tf = new CreateCSVFile.WriteToCSVFile(query, "CA"); 
query = usContext.US_companies 
    .Where(c => 
     c.coverage_status.Equals("active_eq")) 
    .Select(c => new DatapullFields.Datapull 
    { 
     Ticker = c.ticker.Trim(), 
     Exchange = c.primary_exchange.Trim(), 
     CompanyName = c.company_name.Trim() 
    }); 
tf = CreateCSVFile.WriteToCSVFile(query, "US"); 

내가 편집 한 후 지금 가지고있는 내용은 다음과 같습니다 : 여기 내 코드는

public class Datapull 
{ 
    public string CompanyName { get; set; } 
    public string Exchange { get; set; } 
    public string Ticker { get; set; } 
} 

public interface ICountryEntity 
{ 
    string CompanyName { get; set; } 
    string coverage_status { get; set; } 
    string Exchange { get; set; } 
    string Ticker { get; set; } 
} 

public partial class CAEntity : Console.Interface.ICountryEntity 
{ 
} 

public partial class USEntity : Console.Interface.ICountryEntity 
{ 
} 

public static class ToDataPull 
{ 
    public static IEnumerable<T> ToDataPull<T>(this IEnumerable<T> entities) where T : ICountryEntity 
    { 
     return entities.Where(c => 
      c.coverage_status.Equals("active")) 
      .Select(c => new Console.DatapullFields.Datapull 
      { 
       Ticker = c.ticker.Trim(), 
       Exchange = c.primary_exchange.Trim(), 
       CompanyName = c.company_name.Trim() 
      }); 
    } 
} 

가 어떻게이 코드를 리팩토링 할 수 있습니까?

+0

. 시작을위한 엔티티를 많이 검색하는 경우 .Trim()은 성능이 매우 좋아질 수 있습니다. 따라서 필요하지 않으면 제거하십시오. – Joakim

+0

DB 필드는 모든 추가 공간을 반환합니다. 그래서 나는 그들을 다듬어야 만한다. 내 필드에서 Trim()을 수행하는 더 좋은 방법이 있습니까? –

+0

슬프게도 나는 거기 있다고 생각하지 않습니다. 다른 해결책은 데이터베이스의 데이터에서 이러한 여분의 공간을 실제로 제거하여 나중에 다듬을 필요가 없도록하는 것입니다. 데이터베이스 관리자가있는 경우 데이터베이스 관리자가 전달하는 것이 쉽지 않을 수 있습니다 (유사한 문제가 있었으며 데이터베이스 관리자가 실제로 데이터를 조작하도록 유도하는 데 많은 노력이 필요했습니다). – Joakim

답변

0

인터페이스 및 확장 방법을 사용합니다.
더 많은 코드이지만 앞으로 더 깨끗한 코드로 연결됩니다.

예.

public partial class CAEntity : ICountryEntity 
{ 
} 

public partial class USEntity : ICountryEntity 
{ 
} 

public interface ICountryEntity 
{ 
    string Ticker { get; set; } 
    string Exchange { get; set; } 
    string CompanyName { get; set; } 
    string coverage_status { get; set; } 
} 

//Extension Method must go in static class 
public static IEnumerable<T> ToDataPull<T>(this IEnumerable<T> entities) where T: ICountryEntity 
{ 
    return entities.Where(c => 
     c.coverage_status.Equals("active_eq")) 
     .Select(c => new DatapullFields.Datapull 
     { 
      Ticker = c.ticker.Trim(), 
      Exchange = c.primary_exchange.Trim(), 
      CompanyName = c.company_name.Trim() 
     }); 
} 

//Your modified code 
CABEntities caContext = new CAEntities(); 
USEntities usContext = new USEntities(); 

var query = caContext.CA_companies.ToDataPull(); 
CreateCSVFile.WriteToCSVFile tf = new CreateCSVFile.WriteToCSVFile(query, "CA"); 

query = usContext.US_companies.ToDataPull(); 
tf = CreateCSVFile.WriteToCSVFile(query, "US"); 
+0

CAEntity & USEntity에 대한 빈 클래스가있는 이유에 대해 혼란스러워합니다. Pls가 설명합니다. –

+0

CAEntities와 USEntities는 모두 동일한 속성을 가지고 있습니다. 인터페이스를 상속하면 둘 다 이러한 속성을 갖게됩니다. 나중에 UKEntities와 같은 것이 있으면 ICountryEntity에서 상속받을 수 있으며 모든 필드가 나타납니다. CAEntities와 USEntities가 똑같은 속성과 메서드를 가지고 있다면, 나는 그 둘 모두에 대해 하나의 Entity를 생성하는 것이 좋습니다. –

+0

그들은 빈 클래스가 아니며 'ICountryEntity'에서 상속받는 부분 클래스입니다. 이렇게하면 두 가지 방법 모두에서 확장 방법을 사용할 수 있습니다. – Khan