如何判断记录是否仍在SQL表中 - 使用linq可能吗?

时间:2010-04-20 11:27:33

标签: sql linq linq-to-sql

我有一个SQL数据库,它是一个“馈送器”表。我将记录放在所述表中,第三方包使用(并删除)它们。所有hunky dory - 直到第三方包没有运行。在考虑如何检测时,我心想......“好吧......如果我读了表中的所有键(它不是很大 - 最多几十条记录),然后保留它们,然后在5分钟内,我检查是否仍然在桌子上?“

这可能不是一个出色的解决方案,但是它让我不再考虑Linq以及你是否可以做这样的事情(我之前没有使用过Linq)

因此,如果我将所有记录键读入DataTable对象,然后,五分钟后,将所有记录读入另一个DataTable对象,我可以进行Linq选择,连接键列上的两个DataTable对象,以及然后查看“计数”的结果,如果有一个或多个,则表中的数据可能没有被消耗。

或者......是否有一种“聪明”的方式?

4 个答案:

答案 0 :(得分:0)

创建一个DELETE触发器,在单独的表中记录上次删除的时间戳。另外一个INSERT触发器将记录最后一个insert语句的时间戳。

比较两个时间戳。

答案 1 :(得分:0)

您可以在插入后返回标识列值(假设有一个),并将其与其提交日期时间一起记录在一个单独的表中,它们只是将未完成的记录拉出来;

SELECT * FROM feeder_table F
  INNER JOIN other_table T ON (F.id = T.id)
WHERE DATEDIFF(MINUTE, T.commitdate, GETDATE()) > 5

这样你的内存数据就不会持续存在,因此它可以在应用程序重启/跨机器之间工作。

(如果这仅用于故障检测,您只需要存储最后插入的ID。)

答案 2 :(得分:0)

这是一种方式:

DataTable t1 = GetData(); // returns a datatable with an Int16 "Id" column
// time passes... a shabby man enters and steals your lamp
DataTable t2 = GetData();

// some data changes have occurred
t2.Rows.Add(null, DateTime.Now.AddSeconds(10), "Some more");
t2.Rows[1].Delete();

EnumerableRowCollection<DataRow> rows1 = t1.AsEnumerable();
EnumerableRowCollection<DataRow> rows2 = t2.AsEnumerable();

var keys1 = rows1.Select(row => (Int16)row["Id"]).ToList();
var keys2 = rows2.Select(row => (Int16)row["Id"]).ToList();

// how many keys from t1 are still in t2
Console.WriteLine("{0} rows still there", keys1.Count(id => keys2.Contains(id)));

答案 3 :(得分:0)

但这更像我的想法:

DataTable t1 = GetData(); // returns a datatable with an Int16 "Id" column
// time passes... your lamp is getting dim
DataTable t2 = GetData();

// some data changes have occurred
t2.Rows.Add(null, DateTime.Now.AddSeconds(10), "Some more");
t2.Rows[1].Delete();

EnumerableRowCollection<DataRow> rows1 = t1.AsEnumerable();
EnumerableRowCollection<DataRow> rows2 = t2.AsEnumerable();

// how many rows from r1 are still in r2
int n = (from r1 in rows1
        join r2 in rows2 on (Int16)r1["Id"] equals (Int16)r2["Id"]
        select r1).Count();

...这是我在原始问题中提到的“linq / join”方法。