0

ページ上の適切なチェックボックスによってチェックされた文字列の配列をロードするアクションがあります。

        public ActionResult Test1(string[] checked_strings)

groupbyステートメントを動的に作成したいエンティティと名前が等しいこの文字列を使用したいと思います。

これは次のようになります。

            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 リスト (後でビューに返される) を保持します。

4

2 に答える 2

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));
            }
        }
    }

最初の「foreach」が出力されます

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

2番目の「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

お役に立てれば!

于 2013-03-03T22:21:09.473 に答える
1

これが特定の問題にどの程度関連しているかを正確に言うことはできませんが、データをグループ化するフィールドがある場合は、次のようなクエリを記述して、作成された年のブログ投稿をグループ化できます。

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

ここでの「結果」は、グループの列挙です。この場合、特定の年に公開された投稿です。

これをさらに拡張して、「第1レベル」内に子グループを作成できます。

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

それが必要なもののように見えても、それでも機能しない場合は、モデルに関する詳細情報を投稿してください。

于 2013-03-03T10:28:50.947 に答える