【问题标题】:Passing a List to DB and join a property with a Table将列表传递给数据库并将属性与表连接起来
【发布时间】:2011-11-20 13:38:22
【问题描述】:

我有一个Sometype 的列表。 Sometype 有两个属性

Key

ModificationDate

现在我的数据库中有一个名为Measures 的表。它也将这些字段作为列。

我只想得到所有的措施(键应该匹配)和 修改日期(来自列表)> 修改日期(来自表格)。

现在我正在从我的表格中获取所有度量值并在我的应用程序中检查它。我该如何避免这种情况?

PS 我正在使用 Nhibernate。Sometype 实际上是我的应用程序中的一个实体。我还有另一个实体映射到度量表(两者不能相同,因为它有一些附加属性也)

编辑我需要的是,如果我拥有的列表在某种临时列表中,那么查询将是

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

但是如果不将列表中的所有值插入到某个#table中,是否可以做到这一点?

【问题讨论】:

  • 这不只是对 db "WHEREmeasures.Key IN ( ... )" 的标准查询吗?
  • 这就是我现在正在做的事情。但这将影响与 IN 子句中提供的列表匹配的所有措施。我需要再满足一个条件。修改日期要更大。您如何做到这一点,而不是选择所有记录并检查应用程序内的条件?

标签: c# sql nhibernate list c#-4.0


【解决方案1】:

我以前遇到过这种情况。我过去使用的是数据库端的一个函数,它可以获取一个字符列表(比如 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.

如果您需要对表格进行一些强制转换以使 ID 为整数或其他;没关系。我不确定您是否可以将其放入 HQL,但它可以作为查询正常工作。

【讨论】:

  • 我也考虑过这一点,正如您在问题中的编辑中所看到的那样。但它听起来不是很优雅,而且我需要从 Nhibernate 中完成。..
  • 执行“Where In (#,#,...,#)”条件有一个非常实际的限制。除非您使用内存表或临时表设置;当您达到该限制时,您的查询无论如何都会停止工作。
【解决方案2】:

您可以使用这种方法。

在代码中,写一个方法来生成期望的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 类):

string sqlString= "select * from measure A where " + BuildSQL(param); OdbcCommand.CommandText = sqlString; OdbcCommand.executeNonQuery();

Hth.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-04
    • 1970-01-01
    • 2016-06-25
    • 2022-12-12
    • 2017-10-14
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多