2013-02-26 2 views
0

У меня есть действие, которое загружает массив строк, которые были проверены на тире соответствующих флажков на странице:Создание GroupBy Statments Динамически струны массива - Linq к Entity

 public ActionResult Test1(string[] checked_strings) 

Я хотел бы использовать это строки, которые равны по их имени для объектов, которые я хочу создать динамически.

Какой будет идти на что-то вроде этого:

  bool bChecked = Request.Form["checked_strings"].Contains("true"); 
      cmpqry = from x in checked_strings 
         from y in typeof(Company).GetProperties() 
         where y.Name == x.ToString() 
    // Create the groupby statement for the properties matched with the strings // 

Любая идея, как потянуть это снова?

cmpqry содержит список IEnumarable (позже возвращаемый для просмотра) класса модели.

+0

Динамический linq может быть вашим ответом, http://stackoverflow.com/questions/2448611/dynamic-linq-group-by-query-in-asp-net-mvc – Slicksim

+0

Уже пробовал, и я не могу его преобразовать вернуться к модели EF и правильно отобразить ее. Если вы думаете, что это возможно, я бы хотел привести пример. Спасибо. – JBntis

+0

Не удалось использовать «GroupBy» динамического linq, он выдает exeption как из этого примера: var groups = Model.GroupBy («SomeColumn, SomeOtherColumn») даже после того, как я добавил файл библиотеки DynamicLibrary.cs - Пожалуйста, помогите !! – JBntis

ответ

1

Я не могу точно сказать, насколько это актуально для вашей конкретной проблемы, но если у вас есть поле, в котором вы хотите группировать свои данные, вы можете написать запрос, похожий на следующий, который группирует записи в блоге в год они были созданы в

var results = from allPosts in db.Posts.OrderBy(p => p.DateCreated) 
       group allPosts by allPosts.DateCreated.Year into postsByYear; 

в «результаты» здесь перечень групп - в этом случае, сообщения публикуются в определенном году.

Это может быть дополнительно расширены для создания дочерних групп в рамках «первого уровня» - сообщения от месяца группы, аналогичной

var results = from allPosts in db.Posts.OrderBy(p => p.DateCreated) 
       group allPosts by allPosts.DateCreated.Year into postsByYear 

       select new 
       { 
        postsByYear.Key, 
        SubGroups = from yearLevelPosts in postsByYear 
           group yearLevelPosts by yearLevelPosts.DateCreated.Month into postsByMonth; 
       }; 

Теперь подгруппы перечня должностей в течение месяца. Существует более подробная информация здесь (может быть очень полезно)

http://blogs.msdn.com/b/mitsu/archive/2007/12/22/playing-with-linq-grouping-groupbymany.aspx

и здесь (мое заявление о предыдущей ссылке на той или иной проблеме, я имел)

http://www.ynegve.info/Post/156/implementing-a-tree-view-small-case-study

Если это выглядит что вам нужно, но вы все еще не можете заставить его работать, пожалуйста, напишите больше информации о своей модели.

+0

Эй, Евгений, Спасибо за ваше время. Я сделал более хорошо объясненный пост здесь: http://forums.asp.net/t/1885915.aspx/1?GroupBy+changing+number+of+columns+Dynamically+ В основном у меня есть несколько полей что я хочу передать переменную в предложение groupBy вместо жестко закодированной группировки путем обкатки всех возможных сценариев. Чтобы сделать что-то вроде: IEnumerable afs = cmpqry.GroupBy ("CompanyName", "SubBranchName", "ProductName"); и после этого, когда пользователи проверяют разные поля, могут передавать другие значения: IEnumerable afs = cmpqry.GroupBy ("CompanyName", "SomeName"); – JBntis

+0

Простой рисунок диаграммы для иллюстрации: http://oi50.tinypic.com/24n1q8o.jpg – JBntis

2

Вот пример кода, который работает - вы должны быть в состоянии предоставить необходимые поля для группы в том порядке, вы хотите, чтобы они были сгруппированы:

public class Company 
{ 
    public int CompanyID { get; set; } 
    public string CompanyName { get; set; } 
    public string SubBranchName { get; set; } 
    public string ProductName { get; set; } 
} 

public static class MyEnumerableExtensions 
{ 
    /// <summary> 
    /// Applies grouping to the collection of elements using the selectors specified 
    /// </summary> 
    /// <typeparam name="TElement">Type of the element</typeparam> 
    /// <param name="elements">Elements to be grouped</param> 
    /// <param name="groupSelectors">Selectors, or properties to be grouped on</param> 
    /// <returns></returns> 
    public static IEnumerable<GroupResult> GroupByMany<TElement>(
     this IEnumerable<TElement> elements, 
     params Func<TElement, object>[] groupSelectors) 
    { 
     if (groupSelectors.Length > 0) 
     { 
      var selector = groupSelectors.First(); 

      //reduce the list recursively until zero 
      var nextSelectors = groupSelectors.Skip(1).ToArray(); 
      return 
       elements.GroupBy(selector).Select(
        g => new GroupResult 
        { 
         Key = g.Key, 
         Items = g, 
         SubGroups = g.GroupByMany(nextSelectors) 
        }); 
     } 
     return null; 
    } 

    public class GroupResult 
    { 
     public object Key { get; set; } 
     public IEnumerable Items { get; set; } 
     public IEnumerable<GroupResult> SubGroups { get; set; } 
    } 
} 



//Your usage of the GroupByMany 
IEnumerable<Company> list = new List<Company> 
{new Company{CompanyID = 1, CompanyName = "Company1", ProductName = "Product1", SubBranchName = "SB1"}, 
new Company{CompanyID = 2, CompanyName = "Company1", ProductName = "Product2", SubBranchName = "SB2"}, 
new Company{CompanyID = 3, CompanyName = "Company1", ProductName = "Product3", SubBranchName = "SB1"}, 
new Company{CompanyID = 4, CompanyName = "Company2", ProductName = "Product4", SubBranchName = "SB2"}, 
new Company{CompanyID = 5, CompanyName = "Company2", ProductName = "Product1", SubBranchName = "SB2"}, 
new Company{CompanyID = 6, CompanyName = "Company2", ProductName = "Product2", SubBranchName = "SB1"}, 
new Company{CompanyID = 7, CompanyName = "Company2", ProductName = "Product3", SubBranchName = "SB2"}, 
new Company{CompanyID = 8, CompanyName = "Company3", ProductName = "Product4", SubBranchName = "SB2"}, 
new Company{CompanyID = 9, CompanyName = "Company3", ProductName = "Product3", SubBranchName = "SB1"}, 
new Company{CompanyID = 10, CompanyName = "Company3", ProductName = "Product2", SubBranchName = "SB2"}, 
}; 

    var groupedByProductNameThenSubBranchName = list.GroupByMany(p => p.ProductName, p => p.SubBranchName); 

    foreach (var groupResult in groupedByProductNameThenSubBranchName) 
    { 
     foreach (var result in groupResult.SubGroups) 
     { 
      foreach (var groupResult1 in result.Items) 
      { 
       Company company = groupResult1 as Company; 
       Debug.Print(String.Format("ProductName: {0}, SubBranchName: {1}", company.ProductName, company.SubBranchName)); 
      } 
     } 
    } 

    var groupedBySubBranchNameThenCompany = list.GroupByMany(p => p.SubBranchName, p => p.CompanyName); 

    foreach (var groupResult in groupedBySubBranchNameThenCompany) 
    { 
     foreach (var result in groupResult.SubGroups) 
     { 
      foreach (var groupResult1 in result.Items) 
      { 
       Company company = groupResult1 as Company; 
       Debug.Print(String.Format("SubBranchName: {0}, CompanyName: {1}", company.SubBranchName, company.CompanyName)); 
      } 
     } 
    } 

Первый «Еогеасп» печатает

ProductName: Product1, SubBranchName: SB1 
ProductName: Product1, SubBranchName: SB2 
ProductName: Product2, SubBranchName: SB2 
ProductName: Product2, SubBranchName: SB2 
ProductName: Product2, SubBranchName: SB1 
ProductName: Product3, SubBranchName: SB1 
ProductName: Product3, SubBranchName: SB1 
ProductName: Product3, SubBranchName: SB2 
ProductName: Product4, SubBranchName: SB2 
ProductName: Product4, SubBranchName: SB2 

второй "Foreach" печатает

SubBranchName: SB1, CompanyName: Company1 
SubBranchName: SB1, CompanyName: Company1 
SubBranchName: SB1, CompanyName: Company2 
SubBranchName: SB1, CompanyName: Company3 
SubBranchName: SB2, CompanyName: Company1 
SubBranchName: SB2, CompanyName: Company2 
SubBranchName: SB2, CompanyName: Company2 
SubBranchName: SB2, CompanyName: Company2 
SubBranchName: SB2, CompanyName: Company3 
SubBranchName: SB2, CompanyName: Company3 

Надеется, что это помогает!

+0

Возможно использование 'IQueryable ' и 'Expression >', чтобы иметь возможность группировать «изначально» и вставить в дерево выражений и отправить обратно в БД? –

+0

И если я хочу groupBy только одну группу без подгрупп? – JBntis

+0

Ну, это потрясающе evgeny, как вы передаете GroupByMany (p => p.DynamicField1, p => p.DynamicField2 ... p => p.DynamicFieldN) и все динамические изменения в подгруппе позже? с помощью цикла из строк или что? Основная причина состоит в том, чтобы создать компанию после группы и передать ее в представление. большое спасибо! – JBntis

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