gpt4 book ai didi

c# - 有什么方法可以在执行之后/期间延迟执行针对 IQueryable 的委托(delegate)?

转载 作者:行者123 更新时间:2023-11-30 12:37:00 24 4
gpt4 key购买 nike

我从我的业务层公开一个 IQueryable 方法以供其他层使用。一旦查询执行到下层,我想对枚举中的每个项目执行一个函数。

似乎应该有一个在查询执行后引发的事件,这样我就可以对来自这个公共(public)层的结果进行操作。

类似于:

public IQueryable<User> Query() 
{
return _Repository.Query<User>().ForEachDelayed(u=> AppendData(u));
}

我希望 ForEachDelayed 函数在不执行查询的情况下返回 IQueryable。这个想法是,一旦查询被执行,结果就会通过这个委托(delegate)传递。

有这样的东西吗?如果没有,是否有我可以订阅的类似“IQueryable.OnExecute”的事件?

任何帮助都会很棒 - 谢谢!

编辑:

我以为我找到了答案:

var users = from u in _Repository.Query<User>()
select AppendData(u);
return users;

但是现在,我收到以下错误:

方法“AppendData(User)”没有支持的 SQL 转换。

我真的需要一个委托(delegate)在查询执行后运行。

最佳答案

简单的方法

另一个更简单的选择是使用 Iterator 附加您需要的内容,请参见下面的示例。这种方法的缺点是,在执行迭代时,所有内容都将被拉入内存,因此 AppendData 仅在返回的数据上执行。这类似于@Chris 的选项,但您不必在每次要使用该方法时都强制创建新的 FuncSelect 查询。

static void Main(string[] args)
{
var data = new List<int> { 1, 2, 3, 4, 5 }.AsQueryable().AppendData();

Console.WriteLine("Before execute");

Console.Write("{ ");
foreach (var x in data)
Console.Write("{0}, ", x);

Console.WriteLine( "}");

Console.WriteLine("After execute");

Console.Read();
}

// Append extra data. From this point on everything is in memory
// This should be generic, i.e. AppendData<T>, but I an easy way to "append"
static IEnumerable<int> AppendData(this IEnumerable<int> data)
{
Console.WriteLine("Adding");
foreach (var x in data)
yield return x * 2;
}

艰难的道路

我不相信有任何像这样的内置事件,但您可以通过实现自己的 IQueryable 包装器来添加自己的事件。

Here是一个关于编写完整的 IQueryable 提供程序的系列,它还将向您展示可以在何处放置包装器,最有可能围绕该 IQueryProvider

祝你好运,希望这对你有所帮助。

关于c# - 有什么方法可以在执行之后/期间延迟执行针对 IQueryable<T> 的委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2186886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com