Sql MVC:创建动态群组的最佳方式

Sql MVC:创建动态群组的最佳方式,sql,asp.net-mvc,linq,entity-framework,group-by,Sql,Asp.net Mvc,Linq,Entity Framework,Group By,我得到了一个项目列表,每次都可以通过不同的检查和传递。 选定的项目将移动到包含这些选中项目的字符串列表中 我想学习一种方法,它可以帮助我创建所选列分组所需的查询,例如,如果我选中“OperatorTypeName”和“CompanyName”,我将收到相对查询: SELECT OperatorTypeName AS Group1, Company.CompanyName AS Group2, SUM(Adv.Price) AS SumPrice FROM Adv (nolock) INN

我得到了一个项目列表,每次都可以通过不同的检查和传递。 选定的项目将移动到包含这些选中项目的字符串列表中

我想学习一种方法,它可以帮助我创建所选列分组所需的查询,例如,如果我选中“OperatorTypeName”和“CompanyName”,我将收到相对查询:

SELECT OperatorTypeName AS Group1, Company.CompanyName AS Group2, SUM(Adv.Price) 
AS SumPrice 
FROM Adv  (nolock) 
INNER JOIN Program (nolock) 
    ON Adv.ProgramID = Program.ProgramID 
INNER JOIN Operator (nolock)  
    ON Program.OperatorID = Operator.OperatorID 
INNER JOIN OperatorType (nolock)  
    ON Operator.OperatorTypeID = OperatorType.OperatorTypeID 
INNER JOIN CampaignVersion (nolock) 
    ON Adv.CampaignVersionID = CampaignVersion.CampaignVersionID 
INNER JOIN Campaign ON CampaignVersion.CampaignID = Campaign.CampaignID
INNER JOIN Campaign2Product (nolock) 
    ON Campaign.CampaignID = Campaign2Product.CampaignID 
INNER JOIN Product2Company (nolock) 
    ON Product2Company.ProductID = Campaign2Product.ProductID 
INNER JOIN Product2SubBranch (nolock) 
    ON Product2SubBranch.ProductID = Campaign2Product.ProductID 
INNER JOIN SubBranch (nolock) 
    ON SubBranch.SubBranchID = Product2SubBranch.SubBranchID
INNER JOIN Branch (nolock) 
    ON SubBranch.BranchID = Branch.BranchID
INNER JOIN Company (nolock) 
    ON Product2Company.CompanyID = Company.CompanyID 
INNER JOIN Company Manager (nolock) on Campaign.Manager =Manager.CompanyID 
             WHERE     (Adv.TransmitDate >= getdate()-7)
             GROUP BY  OperatorTypeName , Company.CompanyName
如果只勾选“OperatorTypeName”,我将收到此条件的相应查询:

SELECT OperatorTypeName AS Group1, SUM(Adv.Price) AS SumPrice 
FROM Adv  (nolock) 
INNER JOIN Program (nolock) 
    ON Adv.ProgramID = Program.ProgramID 
INNER JOIN Operator (nolock)  
    ON Program.OperatorID = Operator.OperatorID 
INNER JOIN OperatorType (nolock)  
    ON Operator.OperatorTypeID = OperatorType.OperatorTypeID 
INNER JOIN CampaignVersion (nolock) 
    ON Adv.CampaignVersionID = CampaignVersion.CampaignVersionID 
INNER JOIN Campaign 
    ON CampaignVersion.CampaignID = Campaign.CampaignID
INNER JOIN Campaign2Product (nolock) 
    ON Campaign.CampaignID = Campaign2Product.CampaignID 
INNER JOIN Product2Company (nolock) 
    ON Product2Company.ProductID = Campaign2Product.ProductID 
INNER JOIN Product2SubBranch (nolock) 
    ON Product2SubBranch.ProductID = Campaign2Product.ProductID 
INNER JOIN SubBranch (nolock) 
    ON SubBranch.SubBranchID = Product2SubBranch.SubBranchID
INNER JOIN Branch (nolock) 
    ON SubBranch.BranchID = Branch.BranchID
INNER JOIN Company (nolock) 
    ON Product2Company.CompanyID = Company.CompanyID 
INNER JOIN Company Manager (nolock) on Campaign.Manager =Manager.CompanyID 
WHERE     (Adv.TransmitDate >= getdate()-7)
GROUP BY  OperatorTypeName
我不想为每一个条件创建每一个查询,因为我可以使用大约30个可能的列创建一个分组。
我可能希望每次有比上一个更大的查询时调用sql,但是如果我加载了10列,而在下一次搜索中只加载了其中的2列,我将从会话查询对其进行分组,但让我们从基本内容开始,如果没有几十个案例来手动创建每个查询,我如何让它工作?

类似的方法可以做到:

string res = SQL.createSQL("OperatorTypeName");
string res2 = SQL.createSQL("OperatorTypeName", "Company.CompanyName");



public static class SQL
{
    public static string createSQL(params string[] columns)
    {
        string top = string.Empty;
        string bottom = string.Empty;
        for (int i = 0; i < columns.Length; i++)
        {
            if (i > 0)
            {
                top += ", ";
                bottom += ", ";
            }
            top += columns[i];
            bottom += columns[i];
            top += string.Format(" AS Group{0}", i + 1);
        }

        string sql = string.Format("SELECT {0}, SUM(Adv.Price) AS SumPrice " +
            "FROM Adv  (nolock) " +
            "INNER JOIN Program (nolock) " +
                "ON Adv.ProgramID = Program.ProgramID " +
            "INNER JOIN Operator (nolock) " +
                "ON Program.OperatorID = Operator.OperatorID " +
            "INNER JOIN OperatorType (nolock) " +
                "ON Operator.OperatorTypeID = OperatorType.OperatorTypeID " +
            "INNER JOIN CampaignVersion (nolock) " +
                "ON Adv.CampaignVersionID = CampaignVersion.CampaignVersionID " +
            "INNER JOIN Campaign " +
                "ON CampaignVersion.CampaignID = Campaign.CampaignID " +
            "INNER JOIN Campaign2Product (nolock) " +
                "ON Campaign.CampaignID = Campaign2Product.CampaignID " +
            "INNER JOIN Product2Company (nolock) " +
                "ON Product2Company.ProductID = Campaign2Product.ProductID " +
            "INNER JOIN Product2SubBranch (nolock) " +
                "ON Product2SubBranch.ProductID = Campaign2Product.ProductID " +
            "INNER JOIN SubBranch (nolock) " +
                "ON SubBranch.SubBranchID = Product2SubBranch.SubBranchID " +
            "INNER JOIN Branch (nolock) " +
                "ON SubBranch.BranchID = Branch.BranchID " +
            "INNER JOIN Company (nolock) " +
                "ON Product2Company.CompanyID = Company.CompanyID " +
            "INNER JOIN Company Manager (nolock) on Campaign.Manager =Manager.CompanyID " +
            "WHERE     (Adv.TransmitDate >= getdate()-7) " +
            "GROUP BY {1}", top, bottom);

        return sql;
    }
}
string res=SQL.createSQL(“OperatorTypeName”);
字符串res2=SQL.createSQL(“OperatorTypeName”、“Company.CompanyName”);
公共静态类SQL
{
公共静态字符串createSQL(参数字符串[]列)
{
string top=string.Empty;
字符串底部=string.Empty;
for(int i=0;i0)
{
top+=“,”;
底部+=“,”;
}
顶部+=列[i];
底部+=列[i];
top+=string.Format(“作为组{0}”,i+1);
}
string sql=string.Format(“选择{0},SUM(Adv.Price)作为SumPrice”+
“来自Adv(nolock)”+
“内部联接程序(nolock)”+
“在Adv.ProgramID=Program.ProgramID上”+
“内部联接运算符(nolock)”+
“ON Program.OperatorID=Operator.OperatorID”+
“内部联接运算符类型(nolock)”+
“在Operator.OperatorTypeID=OperatorType.OperatorTypeID上”+
“内部连接版本(nolock)”+
“在Adv.campaitVersionId=campaitVersion.campaitVersionId上”+
“内部加入活动”+
“在CampaignVersion.CampaignID=Campaign.CampaignID上”+
“内部联接活动2产品(nolock)”+
“在Campaign.CampaignID=Campaign2Product.CampaignID上”+
“内部联接产品2公司(nolock)”+
“关于Product2Company.ProductID=Activity2Product.ProductID”+
“内部联接产品2分支(nolock)”+
“在Product2SubBranch.ProductID=Activity2Product.ProductID上”+
“内部联接分支(nolock)”+
“在SubBranch.SubBranchID=Product2SubBranch.SubBranchID上”+
“内部联接分支(nolock)”+
“在SubBranch.BranchID=Branch.BranchID上”+
“内部联接公司(nolock)”+
“关于Product2Company.CompanyID=Company.CompanyID”+
“活动中的内部加入公司经理(nolock)。经理=经理。公司ID”+
“其中(Adv.TransmitDate>=getdate()-7)”+
“按{1}分组”,顶部、底部);
返回sql;
}
}

最终代码如下所示:

            string res = SQL.createSQL(checked_strings);
        oGrp = qData.GroupToEnum(context, res);
Sql查询生成方法及其更改:

public static class SQL
{
    public static string createSQL(params string[] columns)
    {
        string top = string.Empty;
        string bottom = string.Empty;
        for (int i = 0; i < 5; i++)
        {
            if (i > 0)
            {
                top += ", ";
                if (i < columns.Length)
                {
                    bottom += ", ";
                }
            }

            if (i < columns.Length)
            {
                top += columns[i];
                bottom += columns[i];
            }
            else
            {
                top += "null";
            }
            top += string.Format(" AS Group{0}", i + 1);
        }

        string sql = string.Format("SELECT newid() as ID, {0}, SUM(Adv.Price) AS SumPrice " +
            "FROM Adv  (nolock) " +
            "INNER JOIN Program (nolock) " +
                "ON Adv.ProgramID = Program.ProgramID " +
            "INNER JOIN Operator (nolock) " +
                "ON Program.OperatorID = Operator.OperatorID " +
            "INNER JOIN OperatorType (nolock) " +
                "ON Operator.OperatorTypeID = OperatorType.OperatorTypeID " +
            "INNER JOIN CampaignVersion (nolock) " +
                "ON Adv.CampaignVersionID = CampaignVersion.CampaignVersionID " +
            "INNER JOIN Campaign " +
                "ON CampaignVersion.CampaignID = Campaign.CampaignID " +
            "INNER JOIN Campaign2Product (nolock) " +
                "ON Campaign.CampaignID = Campaign2Product.CampaignID " +
            "INNER JOIN Product2Company (nolock) " +
                "ON Product2Company.ProductID = Campaign2Product.ProductID " +
            "INNER JOIN Product2SubBranch (nolock) " +
                "ON Product2SubBranch.ProductID = Campaign2Product.ProductID " +
            "INNER JOIN SubBranch (nolock) " +
                "ON SubBranch.SubBranchID = Product2SubBranch.SubBranchID " +
            "INNER JOIN Branch (nolock) " +
                "ON SubBranch.BranchID = Branch.BranchID " +
            "INNER JOIN Company (nolock) " +
                "ON Product2Company.CompanyID = Company.CompanyID " +
            "INNER JOIN Company Manager (nolock) on Campaign.Manager =Manager.CompanyID " +
            "WHERE     (Adv.TransmitDate >= getdate()-7) " +
            "GROUP BY {1}", top, bottom);

        return sql;
    }
}
再进行一些设置后返回视图:

return View("GroupTest", oGrp.ToPagedList(pageNumber, pageSize));

您已经发布了一条SQL语句。您是要求将该语句转换为Linq,还是想要T-SQL解决方案或其他什么?我不需要将该语句转换为Linq。这些语句只是一个例子,我需要一种动态地按多个列分组的方法,它们可以调用存储过程,保存对表或视图的查询,这无关紧要。只需要知道是否有可能做到这一点,或者我必须为每一个可能的可分组列场景链接一个500+的大开关?这并不漂亮,但可以看到优秀的入门示例,谢谢!
return View("GroupTest", oGrp.ToPagedList(pageNumber, pageSize));