2014-02-07 131 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

相关问题