sql to linq where case with case

时间:2016-09-15 13:42:31

标签: c# sql linq stored-procedures

我的sp中有以下内容用于where语句:

connectionGroup = new GroupConnection();
connectionGroup.groupConnection(StateMachine.this, new ActionListener() {

@Override
public void actionPerformed(ActionEvent evt) {
//checking connectionGroup.responses == null doesnt work since the connectionRequest gives IOException if no network.So Toastbar doesnt work here.
  if (connectionGroup.responses == null) {
      ToastBar.showErrorMessage("Please check your network connection", 4000);
  }
    if (connectionGroup.responses != null) {
        for (Map<String, Object> element : connectionGroup.responses) {
            String tableName = (String) element.get("name");
            TextArea nameLabel = new TextArea(tableName.toUpperCase());
            f.add(singleRowContainerr);
        }
    }
  }
}

我已经在linq做过:

            SELECT  h.HLDG_DATE,
                m.PTF_FIDEM_ID,
                m.PTF_Name,
                id.IDENTIFIER_NAME, 
                MIN(h.DESCRIPTION) DESCRIPTION,
                ii.SPEC_TABLE,
                m.PTF_CURRENCY, 
                id.IDENTIFIER_VALUE,
                h.CURRENCY,
                h.HLDG_QTY,
                MIN(h.CURRENT_PRICE) current_price,
                h.INSTRUMENT_ID
          FROM HOLDINGS_BREAKDOWN h
            LEFT JOIN FI_SYS_PTFIDX_LIST m on  (m.PTF_FIDEM_ID = h.PORTFOLIO_ID)
            LEFT JOIN inst_identifiers id on   (h.instrument_id = id.instrument_id)
            LEFT JOIN INST_CASH ic ON h.INSTRUMENT_ID = ic.INSTRUMENT_ID
            LEFT JOIN INST_FX_FORWARD iff ON h.INSTRUMENT_ID = iff.INSTRUMENT_ID
            LEFT JOIN INST_FX_SPOT ifs ON h.INSTRUMENT_ID = ifs.INSTRUMENT_ID
            JOIN INST_IDS ii ON h.INSTRUMENT_ID = ii.INSTRUMENT_ID
          WHERE h.PORTFOLIO_ID = 112
            AND h.HLDG_DATE >= '28 November 2014'
            AND  h.HLDG_DATE <= '31 December 2014'
            AND id.IDENTIFIER_NAME = (CASE WHEN ii.SPEC_TABLE 
                in ('INST_BOND','INST_EQUITY','INST_FUTURE') THEN 'ISIN'
                   WHEN ii.SPEC_TABLE ='INST_CASH' THEN 'XXX'   
                   WHEN ii.SPEC_TABLE = 'INST_INDEX_RETURN_SWAP' 
                    THEN 'BBG_UNIQUE' WHEN ii.SPEC_TABLE = 'INST_TOTAL_RETURN_SWAP'
                    THEN 'BBG_UNIQUE' ELSE 'STATESTREET'  END )
         GROUP BY h.HOLDING_PARAMS_ID,h.INSTRUMENT_ID, h.CURRENCY,id.IDENTIFIER_VALUE,h.HLDG_QTY,
                ii.SPEC_TABLE, h.HLDG_DATE,m.PTF_FIDEM_ID,m.PTF_Name,id.IDENTIFIER_NAME,m.PTF_CURRENCY 
         ORDER BY h.HLDG_DATE,Description  DESC

我正在努力解决最后一个条件&#34;案例&#34;你可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

好吧,它可能不会生成相同的CASE语句,但功能等价物将是:

string[] isins = new [] {"I_BOND","I_EQUITY","I_FUTURE"}

...
where  h.PORTFOLIO_ID == Convert.ToInt16(PfID)
   &&  h.HLDG_DATE >= Convert.ToDateTime(DTstart)
   &&  h.HLDG_DATE <= Convert.ToDateTime(DTend)
   &&  id.IDENTIFIER_NAME == (
           inins.Contains(ii.SP_TABLE)            ? "ISIN" :
           ii.S_TABLE == "I_CASH"                 ? "CDB"  :
           ii.S_TABLE == "I_INDEX_RETURN_SWAP"    ? "BBG_UNIQUE"  :
           ii.S_TABLE == "INST_TOTAL_RETURN_SWAP" ? "BBG_UNIQUE"  :
           "STTREET");

另一种选择是将该映射放在表中并改为JOIN

另请注意,您可能必须在Linq语句之外执行Convert.ToXXX调用,并将结果存储为变量,以便它们被Linq视为常量。

答案 1 :(得分:0)

据我所知,在linq2sql中不允许使用switch语句(请纠正我,如果错误的话)。这意味着,没有直接的方法来编写一个语句,该语句将被转换为SQL-Case。

我建议只使用三元运算符?:来构建语句。这不是最美丽的方式,但在这种情况下完全没问题。

(顺便说一下,另一个提示:在linq语句之外转换你的日期。当你这样做时,语句由.NET Framework转换,只有转换后的值才会传递给SQL,而不是整个转换操作,这是非常昂贵的)

答案 2 :(得分:0)

你可以用这样的东西来实现它

var tables = new List<string>{"INST_BOND","INST_EQUITY","INST_FUTURE"};
.........
.. id.IDENTIFIER_NAME = tables.Contains(ii.SPEC_TABLE) 
                         ? "ISIN"
                         : ii.SPEC_TABLE == "INST_CASH" 
                            ? id.IDENTIFIER_NAME == "XXX"
                            :ii.SPEC_TABLE == "INST_INDEX_RETURN_SWAP"
                              ? "BBG_UNIQUE"
                               .........

这将是字面翻译,但您应该创建一个逻辑结构,例如dictionary,例如ii.SPEC_TABLE。并在执行linq后分配该值。如果你想使用linq,那么你需要有一个查找表并加入function members($group_id) { $this->db->where('group_id',$group_id); $query = $this->db->query('SELECT COUNT(group_id) FROM member'); return $query; }