3

where column in (collection)次の方法を使用して、テーブルから行を削除しようとしています。

public void DeleteRows(int parentId, List<int> years)
{
    var yearsAsCommaSeperatedString = ListToCommaSeperatedString(years);
    const string query = "DELETE FROM TABLE t WHERE t.PARENT_ID=:Parent AND t.YEAR in(:yearList)";
    Session
            .CreateSQLQuery(query)
            .SetParameter("Parent", parentId)
            .SetParameter("yearList", yearsAsCommaSeperatedString)
            .ExecuteUpdate();
}

private static string ListToCommaSeperatedString(IEnumerable<int> ints)
{
    var aggregate = ints.Aggregate("", (current, i) => current + (i + ", "));
    return aggregate.Substring(0, aggregate.LastIndexOf(",", StringComparison.Ordinal));
}

問題はyearsAsCommaSeperatedString文字列であるため、データベースはそれを数字として解釈できないことです。また、整数のリストをパラメータとして追加しようとしましたが、NHibernate はそれをどうするかわかりません。

where in(collection)CreateSQLQuery でどのように使用できますか?

4

2 に答える 2

6

このようなものを使用できます

    ISession session = GetSession();
    string hql = @"from Product p
                   where p.Category in (:categories)";

    var categoriesToSearch = new[] {new Category {Id = 1}, new Category {Id = 2}};

    var query = session.CreateQuery(hql);
    query.SetParameterList("categories", categoriesToSearch);

    var products = query.List<Product>();

または、これを試すことができます

public void DeleteRows(int parentId, List<int> years)
{        
    const string query = "DELETE FROM TABLE t WHERE t.PARENT_ID=:Parent AND t.YEAR in (:yearList)";
    Session
            .CreateSQLQuery(query)
            .SetParameter("Parent", parentId)
            .SetParameterList("yearList", years)
            .ExecuteUpdate();
}
于 2012-08-22T08:36:07.350 に答える
1

メソッドが機能する場合は、SetParamterを再度使用できますが、SQLクエリを次のように変更する必要があります。

var yearsAsCommaSeperatedString = ListToCommaSeperatedString(years);
const string query = "DELETE FROM TABLE t WHERE t.PARENT_ID=:Parent AND t.YEAR in(\":yearList\")";
Session .CreateSQLQuery(query)
        .SetParameter("Parent", parentId)
        .SetParameter("yearList", yearsAsCommaSeperatedString)
        .ExecuteUpdate();

文字列の連結(sql-injection)よりも優れている必要があります:)

ご挨拶

于 2012-08-22T13:48:13.303 に答える