2013-03-05 52 views
0

我收到了每次都可以检查和传递的项目列表。 所选项目将被移动到包含这些选中项目的字符串列表中。MVC:创建动态组的最佳方式通过

我想学习的方式,这将帮助我建立通过那些列要求组查询choosen,例如,如果我检查“OperatorTypeName”和“公司名称”生病接收与查询:

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个,生病会从会话查询中对它进行分组,但让我们从基础开始,我怎样才能让它在没有多个案例的情况下工作来手动创建每个查询?

+0

你贴上去的SQL语句。您是否要求将其转换为Linq,或者您想要T-SQL解决方案还是其他? – qujck 2013-03-05 09:03:27

+0

我不需要将语句转换为Linq。 这些语句只是为了举例,我需要一种以动态的方式按几列进行分组的方式,他们可以调用存储过程,将查询保存到表或视图中,无关紧要。只需要知道是否有可能做到这一点,或者生病必须为可分组列的每个可能的scenerio链接一个大型的500+切换器? – JBntis 2013-03-05 10:19:56

+1

这不是很漂亮,但请参阅http://stackoverflow.com/questions/3929041/dynamic-linq-groupby-multiple-columns – 2013-03-05 11:08:39

回答

1

像这样的事情会做到这一点:

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; 
    } 
} 
+0

优秀的首发例子,谢谢! – JBntis 2013-03-05 15:08:49

0

最终代码看起来是这样的:

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

的Enumarating方法,将除外的DbContext并建立查询:

 public IEnumerable<GroupModel> GroupToEnum(DBS dbs, string query) 
    { 


     IEnumerable<GroupModel> grp = dbs.Groups.SqlQuery(query); 


     return grp; 
    } 

调用从控制器这样的方法:

  string res = SQL.createSQL(checked_strings); 
     oGrp = qData.GroupToEnum(context, res); 

返回查看一些调校后:

return View("GroupTest", oGrp.ToPagedList(pageNumber, pageSize)); 
相关问题