Linq如何扩展\覆盖现有的toList()方法

时间:2016-05-04 19:04:16

标签: c# linq linq-to-sql

我正在使用Linq to Sql。我想在调用(System.Linq)toList()方法时打开事务范围。因此,我试图通过创建自定义扩展类来覆盖默认的toList()方法,从而创建新版本的toList()。但是在自定义的toList()扩展中,我想调用现有的default(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()时,它会显示错误。因为,它试图调用自己。那么如何从同名自定义扩展方法调用default(syste.linq)query.toList()?

2 个答案:

答案 0 :(得分:3)

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

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

但是,我确实支持尖叫的评论&#34;等等,你为什么这样做?&#34;。这似乎是一种不理想的方式。也许你应该问一个关于你的问题的更开放的问题,以便为你的全局问题找到更好的答案,这只是解决你的本地语法问题。

答案 1 :(得分:-1)

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

public static List<T> ToList<T>(this IQueryable<T> query)
{ using (TransactionScope ts = CreateNoLockTransaction()) { return query.AsEnumerable().ToList(); } }