2011-09-19 57 views
2

我有一個列表SometypeSometype得到了兩個屬性將一個列表傳遞給數據庫並加入一個表格

Key

ModificationDate

現在,我在我的數據庫的表中調用Measures.It也得到了這些領域的列。

我只想得到所有的措施(鍵應匹配)和 Modiciationdate(從列表)ModiciationDate(從表)。

現在我正在從我的表中提取所有的措施,並在我的應用程序中檢查它。我該如何避免這種情況?

P.S我使用的是Nhibernate。 Sometype實際上是在我app.I也有映射到表的措施(既可以是不一樣的,因爲它已經得到了一些附加的屬性也一樣)

編輯另一個實體的實體我需要的是,如果該列表我已經在某種溫度,那麼查詢將是

select * from Measures A join TempTable B on A.Key=B.Key and A.ModificationDate < B.ModificationDate

但是這樣做可以不將列表中的所有值插入一些#table?

+0

是不是這只是一個標準的查詢數據庫「WHERE Measures.Key IN(...)」? –

+1

這就是我現在正在做的事情。但是,這將會產生與IN子句中提供的列表匹配的所有措施。我需要再次滿足一個條件。修改日期會更長。你怎麼做,而不是挑選所有記錄,並檢查應用程序內的條件? –

回答

0

您可以使用這種方法。

在代碼中,編寫一個方法來生成慾望sql。

private string BuildSQL(List<SomeType> param) 
      { 
       string res = string.Empty; 

       if (param != null && param.Count > 0) 
       { 
        foreach (SomeType type in param) 
        { 
         res += " (A.Key='" + type.Key + "' AND A.ModificationDate < '" + type.ModificationDate + "') OR"; 
        } 
       } 
    if(!string.IsNullOrEmpty(res)) 
{ 
res = res.Substring(0, res.Length - 3); 
} 
       return res; 
      } 

然後,只是通過此SQL入呼叫功能(或許DAO類):

串的SqlString = 「從措施甲選擇*,其中」 + BuildSQL(PARAM); OdbcCommand.CommandText = sqlString; OdbcCommand.executeNonQuery();

Hth。

0

我以前碰到過這個。我過去使用的是數據庫端的一個函數,它可以獲取字符列表(比如csv),並將它們轉換爲您可以加入的臨時表變量。

這個功能的一個例子是:

FUNCTION ListToTable 
( @SEP char(1), 
    @LST varchar(max) 
) RETURNS @TBL TABLE (idx int, txt varchar(max)) AS 
BEGIN 
    DECLARE @IX int, @POS int, @COUNT int, @STR varchar(max) 
    SET @POS = 1 
    SET @IX = 1 
    SET @COUNT = 0 
    WHILE @IX > 0 
    BEGIN 
     SET @IX = charindex(@SEP, @LST, @POS) 
     IF @IX > 0 
     SET @STR = substring(@LST, @POS, @IX - @POS) 
     ELSE 
     SET @STR = substring(@LST, @POS, len(@LST)) 
     SET @COUNT = @COUNT + 1 
     INSERT @TBL (idx, txt) VALUES(@COUNT, @STR) 
     SET @POS = @IX + 1 
    END 
    RETURN 
END 

然後,當你執行你的查詢,你可以說:

SELECT * FROM 
Measures A 
INNER JOIN 
ListToTable(',', '1,1,2,3,5,8,...,21') B 
ON A.Key=B.Key 
AND A.ModificationDate < B.ModificationDate. 

如果你需要做一些鑄造對陣表,使標識整數, 管他呢;沒關係。我不確定您是否可以將其轉換爲HQL,但作爲查詢可以正常工作。

+0

我也想過這個,因爲你可以從我的編輯問題中看到,但它聽起來不是非常優雅的一個,我也需要它從Nhibernate完成.. –

+0

做一個'在哪裏(#,#,..., #)'條件有一個非常真實的限制。除非您使用內存表或臨時表設置;當你達到這個限制時,你的查詢將無法繼續。 –

相關問題