重用linq查询的部分内容

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不是一个做时间戳的好方法.


更新#2(不是那么快)

虽然我可以执行诸如Documents.Where(...).GetMostRecentTimestamp()之类的查询,但如果我尝试执行基于关联的查询(例如MyCustomer.Orders.GetMostRecentTimestamp()或MyCustomer.Orders.AsQueryable),此解决方案将失败( ).GetMostRecentTimestamp();

Tej*_*ejs 6

这实际上很容易做到.您只需要在要为其提供此实体的实体上定义接口:

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)