2013-03-05 48 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)); 
相關問題