Sql MVC:创建动态群组的最佳方式
我得到了一个项目列表,每次都可以通过不同的检查和传递。 选定的项目将移动到包含这些选中项目的字符串列表中 我想学习一种方法,它可以帮助我创建所选列分组所需的查询,例如,如果我选中“OperatorTypeName”和“CompanyName”,我将收到相对查询: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
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));