我正在使用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()?
答案 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();
}
}