2014-02-07 4 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); 

и получить DataSource.

+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

Смежные вопросы