2014-02-07 71 views
0

我有這種重複的代碼:我可以把它放在單獨的課堂上嗎?

var expCodes = (from cpdet in _dataContextOrders.CodeProfileDetails 
       join cpd in _dataContextOrders.CodeProfileDefinitions on cpdet.CodeProfileDefinitionID equals cpd.ID 
       join cp in _dataContextOrders.CodeProfiles on cpd.CodeProfileID equals cp.ID 
       join cc in _dataContextOrders.FMSCostCentres on cpdet.CostCentreID equals cc.ID 
       join ec in _dataContextOrders.FMSExpenseCodes on cpdet.ExpenseCodeID equals ec.ID 
       where cp.ID == Convert.ToInt32(intCostCodeProfileId) 
            && cpdet.CostCentreID == Convert.ToInt32(intCostCentreSelected) 
            && ec.Active == true 
       select new 
       { 
        ec.ID, 
        ec.CostCentreID, 
        ExpenseCodeExternalRef = ec.ExternalRef, 
        ExpenseCodeDescription = ec.Description, 
        displayExpenseCode = ec.ExternalRef + " " + ec.Description 
       }).Distinct().OrderBy(ec => ec.displayExpenseCode); 

ddlExpCode1.DataSource = expCodes; 
ddlExpCode1.DataTextField = "displayExpenseCode"; 
ddlExpCode1.DataValueField = "ID"; 

我想什麼做的是把它變成一個類自身,正如我們之前LinqToSql做,我可以從我的aspx.cs頁面調用,使用2個參數intCostCodeProfileId和intCostCodeProfileId,它將返回下拉列表的數據。

我該怎麼做?

回答

-1

創建一個普通類(例如Connection.cs),並添加一些像這樣的代碼:

public class MyDataSourceReturner 
{ 
    public static Object retDatasource(Object _dataContextOrders, int intCostCodeProfileId){ 
    var expCodes = (from cpdet in _dataContextOrders.CodeProfileDetails 
      join cpd in _dataContextOrders.CodeProfileDefinitions on cpdet.CodeProfileDefinitionID equals cpd.ID 
      join cp in _dataContextOrders.CodeProfiles on cpd.CodeProfileID equals cp.ID 
      join cc in _dataContextOrders.FMSCostCentres on cpdet.CostCentreID equals cc.ID 
      join ec in _dataContextOrders.FMSExpenseCodes on cpdet.ExpenseCodeID equals ec.ID 
      where cp.ID == Convert.ToInt32(intCostCodeProfileId) 
           && cpdet.CostCentreID == Convert.ToInt32(intCostCentreSelected) 
           && ec.Active == true 
      select new 
      { 
       ec.ID, 
       ec.CostCentreID, 
       ExpenseCodeExternalRef = ec.ExternalRef, 
       ExpenseCodeDescription = ec.Description, 
       displayExpenseCode = ec.ExternalRef + " " + ec.Description 
      }).Distinct().OrderBy(ec => ec.displayExpenseCode); 

    return expCodes; 
    } 
} 

之後,您可以使用此代碼:

ddlExpCode1.DataSource = MyDataSourceReturner.retDatasource(_dataContextOrders, 5); 

,並收到您的數據源。

+0

輝煌。這只是我正在尋找的解決方案。 –

+0

不客氣:) 我忘了添加intCostCentreSelected參數,但您肯定知道如何向函數添加第三個參數。 – Visionstar

+0

我有另一個實例,稍後再做一些額外的修改,如果我將它移開,它將不起作用: –

2

您必須創建一個與您的select語句(ID,CostCentreId等)中的屬性相匹配的模型類。然後修改select new {select new FreshlyCreatedModelClass() {

從您的方法返回匿名類型的唯一方法是使用IEnumerable<object>IEnumerable<dynamic>既不應該在此方案中推薦。您的方法應該返回IEnumerable<FreshlyCreatedModelClass>(如果需要進一步構建查詢,則可以使用IQueryable<FreshlyCreatedModelClass>)。

對模型類進行排序後,您只需將代碼移動到單獨的方法即可。

+0

對不起,我完全不理解這一點。 –

+0

@SteveStaple你知道嗎?創建一個新類來表示返回的對象,而不是使用匿名類型。創建這些新類型的序列,而不是匿名對象。基本上給匿名對象一個名字。 – Servy

相關問題