Dav*_*vid 1 c# linq linq-to-sql
我们有一个使用Linq-To-Sql的程序,并在我们的表上做了很多类似的查询.特别是,我们有一个timestamp列,我们提取最新的时间戳,以查看自上次查询以来表是否已更改.
System.Data.Linq.Binary ts;
ts = context.Documents
.Select(r => r.m_Timestamp)
.OrderByDescending(r => r)
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
我们经常在与当前表单/查询无关的不同表上重复此查询.我想要做的是创建一个"函数"或可以重复此查询的最后3行的东西(理想情况下可以在每个表上工作).这是我想写的:
System.Data.Linq.Binary ts;
ts = context.Documents
.GetMostRecentTimestamp();
Run Code Online (Sandbox Code Playgroud)
但我不知道如何创建这个"GetMostRecentTimestamp".而且,这些查询从未如此简单.它们通常由客户或当前订单过滤,因此可能会有更有效的查询
ts = context.Documents
.Where(r => r.CustomerID == ThisCustomerID)
.GetMostRecentTiemstamp();
Run Code Online (Sandbox Code Playgroud)
有帮助吗?谢谢!
我选择了Bala R的答案,这里是更新的代码所以它编译:
public static System.Data.Linq.Binary GetMostRecentTimestamp(this IQueryable<Data.Document> docs)
{
return docs
.Select(r => r.m_Timestamp)
.OrderByDescending(r => r)
.FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案的唯一缺点是我必须为每个表编写这个函数.我会喜欢Tejs的答案,如果它真的有效,但我不会为它重新设计我的数据库.加上DateTime不是一个做时间戳的好方法.
虽然我可以执行诸如Documents.Where(...).GetMostRecentTimestamp()之类的查询,但如果我尝试执行基于关联的查询(例如MyCustomer.Orders.GetMostRecentTimestamp()或MyCustomer.Orders.AsQueryable),此解决方案将失败( ).GetMostRecentTimestamp();
这实际上很容易做到.您只需要在要为其提供此实体的实体上定义接口:
public class MyEntity : ITimestamp
Run Code Online (Sandbox Code Playgroud)
然后,你的扩展方法:
public static DateTime GetMostRecentTimestamp<T>(this IQueryable<T> queryable)
where T : ITimestamp
{
return queryable.Select(x => x.m_Timestamp)
.OrderByDescending(r => r)
.FirstOrDefault()
}
Run Code Online (Sandbox Code Playgroud)
这对匹配接口的任何实体都很有用:
context.Documents.GetMostRecentTimestamp()
context.SomeOtherEntity.GetMostRecentTimestamp()
Run Code Online (Sandbox Code Playgroud)