Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将列表传递给DB并将属性与表联接_C#_Sql_Nhibernate_List_C# 4.0 - Fatal编程技术网

C# 将列表传递给DB并将属性与表联接

C# 将列表传递给DB并将属性与表联接,c#,sql,nhibernate,list,c#-4.0,C#,Sql,Nhibernate,List,C# 4.0,我有一张某种类型的清单。Sometype有两个属性 钥匙 修改日期 现在,我在数据库中有一个名为Measures的表,它还将这些字段作为列 我只想得到钥匙应该匹配的所有尺寸 ModificationDateFrom列表>ModificationDateFrom表 现在我正在从我的表中获取所有度量值,并在我的应用程序中进行检查。我如何避免这种情况 另外,我正在使用Nhibernate。Sometype实际上是我应用程序中的一个实体。我还有另一个映射到度量表的实体。这两个实体不能相同,因为它还具有一

我有一张某种类型的清单。Sometype有两个属性

钥匙

修改日期

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

我只想得到钥匙应该匹配的所有尺寸 ModificationDateFrom列表>ModificationDateFrom表

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

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

编辑我需要的是,如果我的列表是某种诱人的,那么查询将是

从测量A.Key=B.Key和A.ModificationDate
但是,不将列表中的所有值插入到某个表中就可以完成吗?

您可以使用这种方法

在代码中,编写生成所需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传递到调用函数类:

string sqlString=从度量值A中选择*,其中+BuildSQLparam; OdbcCommand.CommandText=sqlString; OdbcCommand.ExecuteOnQuery


Hth.

您可以使用这种方法

在代码中,编写生成所需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传递到调用函数类:

string sqlString=从度量值A中选择*,其中+BuildSQLparam; OdbcCommand.CommandText=sqlString; OdbcCommand.ExecuteOnQuery


嗯。

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

如果您需要对表进行一些强制转换以生成IDs int或其他内容;那很好。我不确定您是否可以将其输入HQL,但它作为一个查询工作得很好。

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

如果您需要对表进行一些强制转换以生成IDs int或其他内容;那很好。我不确定您是否可以将其输入HQL,但它作为一个查询很好。

这不是对db WHERE Measures.Key IN的标准查询吗?这就是我现在正在做的。但这将影响所有与in条款中提供的列表相匹配的措施。我还需要满足一个条件。修改日期将更大。您如何做到这一点,而不是拾取所有记录并检查应用程序中的条件?这难道不只是对db WHERE Measures.Key IN…(度量值)的标准查询吗?这就是我现在正在做的。但这将影响所有与in条款中提供的列表相匹配的措施。我还需要满足一个条件。修改日期要更长。你怎么做,而不是选择所有记录并检查应用程序内的条件?我也考虑过这一点,你可以从我的编辑问题中看到。但这听起来不是很优雅,我也需要从Nhibernate完成。做一个“Where in,,,,,,,,”条件有一个非常实际的限制。除非使用内存表或临时表设置;当您达到该限制时,您的查询将停止工作。我也考虑过这一点,您可以从我的相关编辑中看到。但这听起来不是很优雅,而且我需要从Nhibernate完成。执行“Where in,,…,”条件有一个非常实际的限制。除非使用内存表或临时表设置;当您达到该限制时,您的查询将停止工作。