C# 将列表传递给DB并将属性与表联接
我有一张某种类型的清单。Sometype有两个属性 钥匙 修改日期 现在,我在数据库中有一个名为Measures的表,它还将这些字段作为列 我只想得到钥匙应该匹配的所有尺寸 ModificationDateFrom列表>ModificationDateFrom表 现在我正在从我的表中获取所有度量值,并在我的应用程序中进行检查。我如何避免这种情况 另外,我正在使用Nhibernate。Sometype实际上是我应用程序中的一个实体。我还有另一个映射到度量表的实体。这两个实体不能相同,因为它还具有一些附加属性 编辑我需要的是,如果我的列表是某种诱人的,那么查询将是 从测量A.Key=B.Key和A.ModificationDateC# 将列表传递给DB并将属性与表联接,c#,sql,nhibernate,list,c#-4.0,C#,Sql,Nhibernate,List,C# 4.0,我有一张某种类型的清单。Sometype有两个属性 钥匙 修改日期 现在,我在数据库中有一个名为Measures的表,它还将这些字段作为列 我只想得到钥匙应该匹配的所有尺寸 ModificationDateFrom列表>ModificationDateFrom表 现在我正在从我的表中获取所有度量值,并在我的应用程序中进行检查。我如何避免这种情况 另外,我正在使用Nhibernate。Sometype实际上是我应用程序中的一个实体。我还有另一个映射到度量表的实体。这两个实体不能相同,因为它还具有一
但是,不将列表中的所有值插入到某个表中就可以完成吗?您可以使用这种方法 在代码中,编写生成所需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,,…,”条件有一个非常实际的限制。除非使用内存表或临时表设置;当您达到该限制时,您的查询将停止工作。