如果你对文字值没问题,你可以使用以下类:
/// <summary>
/// IN expression with inlined parameters like "Id IN (1, 2, 3)"
/// </summary>
public class InlineInExpression : SimpleExpression
{
//Note!!! this works properly only for numeric types. String list requires escaping and wrapping each value in `[escapedValue]`
public static InlineInExpression For<T>(string propertyPath, IEnumerable<T> list)
{
return new InlineInExpression(propertyPath, string.Join(", ", list));
}
/// <summary>
/// IN expression ctor
/// </summary>
/// <param name="propertyPath">Property path</param>
/// <param name="inExpression">Coma-delimited parameters like "1, 2, 3"</param>
private InlineInExpression(string propertyPath, string inExpression)
:base(propertyPath, null, inExpression)
{
}
public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
SqlString[] columnNames =
CriterionUtil.GetColumnNamesForSimpleExpression(PropertyName, null, criteriaQuery, criteria, this, Value);
if (columnNames.Length != 1)
throw new HibernateException("This expression supports only single column properties.");
return new SqlString(columnNames[0], " IN (", Op, ")");
}
}
及用法示例:
Query.Add(InlineInExpression.For("df.ID", myList));
请注意,它仅适用于数值(int、long 等)。如果需要字符串处理 - 你应该自己实现它。
您还可以将此方法应用于您的解决方案,以避免将 SQLCriterion 与表别名和列名一起使用。