将Linq和a.ToList()、.Single()等作为func参数传递给另一个方法是否安全?
我需要用一些重试策略逻辑包装一些Linq查询 通过这个安全吗:将Linq和a.ToList()、.Single()等作为func参数传递给另一个方法是否安全?,linq,c#-4.0,datacontext,func,Linq,C# 4.0,Datacontext,Func,我需要用一些重试策略逻辑包装一些Linq查询 通过这个安全吗: return WithRetry<User>(() => dataContext.Users.Where(u => u.UserID == userID).SingleOrDefault()); returnwithretry(()=> 其中(u=>u.UserID==UserID.SingleOrDefault()); 为此: public TResult WithRetry<TResul
return WithRetry<User>(() =>
dataContext.Users.Where(u => u.UserID == userID).SingleOrDefault());
returnwithretry(()=>
其中(u=>u.UserID==UserID.SingleOrDefault());
为此:
public TResult WithRetry<TResult>(Func<TResult> methodCall)
{
// My Try/Catch Retry Code
}
public TResult with retry(Func methodCall)
{
//我的Try/Catch重试代码
}
或者,第一行的构造应该是这样的:
return WithRetry<User>(() =>
{
return dataContext.Users
.Where(u => u.UserID == userID)
.SingleOrDefault();
});
returnwithretry(()=>
{
返回dataContext.Users
.Where(u=>u.UserID==UserID)
.SingleOrDefault();
});
AFAIK,如果方法的参数类型是Func
,调用它将自动作为函数传递,而不执行它。您不需要在匿名函数包装器中进一步包装它。不需要匿名包装器。只需直接传递lambda expression函数调用。不确定数组在这里有什么帮助?它不是数组,最后一个片段会将linq封装在匿名函数中(我相信)。啊,我明白了。您需要将return
放在前面。不管怎样,在我的测试中,它们似乎有相同的类型(System.Func`1[User]
),谢谢你指出我的错误。我知道代码是可以编译的,但我不知道它在执行查询时是否会以某种方式表现出不可预测的行为。@Vyrotek:您希望得到什么不可预测的结果?谁能预测您特定场景中的所有变量?运行一些测试,看看它是否工作!