将List传递给DB,并将属性与Table连接
本文关键字:属性 Table 连接 DB List | 更新日期: 2023-09-27 18:09:15
我有一个Sometype
的列表。Sometype
有两个性质
Key
ModificationDate
现在我有一个表在我的数据库称为措施。它也有这些字段作为列。
我只是想得到所有的措施(键应该匹配)和modidicationdate (from List)> modidicationdate (from table).
现在我从我的表中获取所有的措施,并检查它在我的应用程序。我怎么能避免这种情况?
p。S我正在使用Nhibernate。Sometype
实际上是我的应用程序中的一个实体。我也有另一个实体映射到测量表(两者不能是相同的,因为它有一些额外的属性以及)
编辑我需要的是,如果我的列表是在某种类型的temptable,那么查询将是
select * from Measures A join TempTable B on A.Key=B.Key and A.ModificationDate < B.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传递到调用函数(可能是DAO类):
string sqlString= "select * from Measures A where " + BuildSQL(param);OdbcCommand。CommandText = sqlString;
OdbcCommand.executeNonQuery ();Hth .
我以前遇到过这种情况。我过去使用的是数据库端上的一个函数,它可以接受一个字符列表(比如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,但它作为一个查询工作得很好。