2013-07-31 87 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

數據庫字段返回所有額外的空間。這就是爲什麼我必須修剪它們。有沒有更好的方法在我的領域做Trim()? –

+0

不幸的是,我不認爲有這樣的解決方案,只有其他解決方案是從數據庫中的數據中實際刪除這些額外的空間,以便以後不必修剪它。如果有數據庫管理員通過這種方式可能並不容易(我遇到過類似的問題,並且花費了相當大的努力來說服我的數據庫管理員實際操縱數據)。 – Joakim

回答

0

我會使用接口和擴展方法。
這是更多的代碼,但它導致未來更乾淨的代碼。

E.g.

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的空類。請解釋一下。 –

+0

考慮到你是個例子,CAEntities和USEntities都具有相同的屬性。通過從接口繼承,他們都獲得這些屬性。後來,如果你有像UKEntities這樣的東西,你可以繼承ICountryEntity,你的所有領域都會在那裏。如果您的CAEntities和USEntities具有完全相同的屬性和方法,我會建議僅爲它們創建一個實體。 –

+0

它們不是空類,它們是部分類,使它們從'ICountryEntity'繼承。這使得擴展方法對它們都可用。 – Khan