Linq 如何 Extend\Override 现有的 toList() 方法

Linq how to Extend\Override existing toList() Method

我正在使用 Linq Sql。我想在调用 (System.Linq) toList() 方法时打开事务范围。因此,我试图通过创建自定义扩展 class 来覆盖默认的 toList() 方法,从而创建新版本的 toList()。但是在自定义 toList() 扩展中,我想调用现有的默认 (system.linq) ToList() 方法。但我不能那样做。请看下面的例子:

代码:

public static int GetRecordsWithNoChangeToQuery()
{
    string connection = ConfigurationManager.ConnectionStrings["EventConn"].ConnectionString;
    using (var ctx = new EventsDataContext(connection))
    {
        var records = (from m in ctx.Event select m).ToList(); //calling custom extension method
        return records.Count();
    }
}

LinqExtenionHeler

public static class LinqExtension
{
    public static TransactionScope CreateLockTransaction()
    {
        var options = new TransactionOptions
        {
            IsolationLevel = IsolationLevel.ReadCommitted
        };
        return new TransactionScope(TransactionScopeOption.Required, options);
    }

    //custom extension method
    public static List<T> ToList<T>(this IEnumerable<T> query)
    {
        using (TransactionScope ts = CreateLockTransaction())
        {
            return query.ToList(); //fails, not able to call system.linq .toList method
        }
    }
}

在上面的代码中,当我调用 query.ToList() 时,它会抛出错误。因为,它正在尝试调用 itself.So 如何从同名自定义扩展方法调用默认 (syste.linq) query.toList()?

扩展方法只是调用 public 静态方法的一种奇特方式。您仍然可以按正常方式调用它,有时您必须这样做。

 return System.Linq.Enumerable.ToList(query); 

不过,我确实支持尖叫的评论 "wait, why are you doing this?"。这似乎是解决此问题的次优方法。也许你应该问一个关于你的问题的更开放的问题,以获得更好的全球问题答案,这只是解决你当地的语法问题。

您为 List 创建的扩展方法,它将在内部调用自身,因为查询类型是 IEnumerable,这将通过异常或可能处于死锁状态。 因此,对于 ToList 扩展方法,您可以做一件事,即传递参数可以是 IQueryable。 所以语法为-

public static List<T> ToList<T>(此 IQueryable<T> 查询)<br> { 使用 (TransactionScope ts = CreateNoLockTransaction()) { return query.AsEnumerable().ToList(); } }