【问题标题】:NHibernate Delete from Where COLUMN in (collection)NHibernate Delete from Where COLUMN in (collection)
【发布时间】:2012-08-22 08:25:16
【问题描述】:

我正在尝试使用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 一起使用?

【问题讨论】:

    标签: c# sql nhibernate


    【解决方案1】:

    你可以使用这样的东西

        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();
    }
    

    【讨论】:

    • 这对我帮助不大。我没有任何映射实体,我只想从表中删除一些行。我尝试使用列表中的数组,但这并没有帮助我。
    • +1 您编辑的答案是使用 NH 的方法 - 使用 SQL 或 HQL 查询。
    • @randoms 如果你没有任何映射实体,你用 NHibernate 做什么??
    【解决方案2】:

    如果您的方法有效,您可以再次使用 SetParamter,但必须将 SQL-Query 更改为以下内容:

    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)更好:)

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 2012-11-17
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多