2011-10-21 76 views
0

我想設置一個參數爲MultiQuery內查詢:如何在MultiQuery中設置查詢參數? 「指定的參數代碼被用於多個查詢中。」

var multiQuery = SessionHolder.Current.CreateMultiQuery(); 

foreach (string name in names) 
{ 
    var query = SessionHolder.Current 
     .CreateQuery("select c.Name, c.Surname " + 
        "from Person as p " + 
        "where p.Name = :name or " + 
          "p.Name like ':name/%'") 
     .SetParameter("name", name); 

    multiQuery = multiQuery.Add(query); 
} 

var multiQueryResult = multiQuery.List(); 

並得到此異常:

QueryException was unhandled by user code

The named parameter code was used in more than one query. Either give unique names to your parameters, or use the multi query SetParameter() methods to set the named parameter

如何使用多查詢的setParameter ()方法來設置命名參數,以便該示例按預期工作?

感謝您的回覆!

回答

2

也許不是太乾淨,但你認爲使用一個唯一的ID參數?

int i = 0; 
foreach (string name in names) 
{ 
    string paramname = "name" + (++i).ToString(); 
    var query = SessionHolder.Current 
     .CreateQuery("select c.Name, c.Surname " + 
        "from Person as p " + 
        "where p.Name = :" + paramname + " or " + 
          "p.Name like ':" + paramname + "/%'") 
     .SetParameter(paramname, name); 
    multiQuery = multiQuery.Add(query); 
} 
+0

這是我腦子裏想的,但我還是對其他推薦方案來解決錯誤珍玩:「或者使用多查詢的setParameter()方法設置命名參數「。 –

2

您需要考慮multiquery實際上在做什麼。

你要與一個單一的查詢,看起來像這樣的數據庫,最終在幕後:

select p.Name, p.Surname from Person as p where p.Name = :name or p.Name like ':name/%' 
select p.Name, p.Surname from Person as p where p.Name = :name or p.Name like ':name/%' 
select p.Name, p.Surname from Person as p where p.Name = :name or p.Name like ':name/%' 
select p.Name, p.Surname from Person as p where p.Name = :name or p.Name like ':name/%' 
select p.Name, p.Surname from Person as p where p.Name = :name or p.Name like ':name/%' 
... 

你可能不希望在查詢作爲各部分的相同標準沒有多大意義。如果這是你想要做的,你應該使用獨特的名字。

然而,看着你的查詢,你可能想重寫它到一個具有多個條件的查詢中。

也許什麼用標準更像是:

p.Name in (:names) or (p.Name like ':name1/%' or p.Name like ':name2/%' ...) 
+0

是的,查詢部分是多餘的,但他們給我的結果分組爲我所需要的。最後,我不得不使用單個查詢,並從結果中獲得分組結果。 –