我从业务层公开了一个IQueryable方法,以便在其他层中使用.一旦查询执行到低级别,我想对枚举中的每个项执行一个函数.
似乎应该在查询执行后引发一个事件,以便我可以对此公共层的结果进行操作.
就像是:
public IQueryable<User> Query()
{
return _Repository.Query<User>().ForEachDelayed(u=> AppendData(u));
}
我希望ForEachDelayed函数在不执行查询的情况下返回IQueryable.这个想法是,一旦执行查询,结果将通过此委托传递.
那里有类似的东西吗?如果没有,是否有可以订阅的“IQueryable.OnExecute”等事件?
任何帮助都会很棒 – 谢谢!
编辑:
我以为我有这个答案:
var users = from u in _Repository.Query<User>()
select AppendData(u);
return users;
但现在,我收到以下错误:
方法’AppendData(User)’没有支持的SQL转换.
我确实需要一个委托来执行查询后运行.
最佳答案 简单的方法
另一个更简单的选择是使用Iterator附加您需要的内容,请参阅下面的示例.这种方法的缺点是,在执行迭代时,所有内容都会被拉入内存,因此只对返回的数据执行AppendData.这类似于@Chris的选项,但是每次要使用该方法时都不会强制创建新的Func和Select查询.
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周围.
祝你好运,希望这能帮到你.