[英]Is there any way to delay- execute a delegate against an IQueryable<T> after/during execution?
我從業務層公開了一個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
and 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
包裝器來添加自己的事件。
這是編寫完整的IQueryable
提供程序的系列,這還將向您顯示適合包裝的位置,最有可能圍繞該IQueryProvider
。
祝你好運,希望這能幫到你。
您看過ToExpandable()嗎?
http://tomasp.net/blog/linq-expand.aspx
您始終可以在執行代碼之前調用ToList()-這將調用SQL,然后您可以在結果集上運行代碼-
var users = from u in _Repository.Query<User>().ToList();
//this will invoke AppendData() for each u
var retVal = from u in users
select AppendData(u);
return retVal;
我還沒有嘗試過,但是我認為您可以使用自動映射器映射到返回IQuerible的其他對象,並在查詢完成后在映射上使用“ AfterMap”執行代碼。
現在您正在使用一些ORM,對嗎? 我很確定您可以通過顯式使用select的IEnumerable版本而不是IQueryable來使用lambda表達式形式實現此目的。
var users = (_Repository.Query<User>() as IEnumerable<User>).Select(u => AppendDate(u));
return users;
實際執行查詢時,它將獲取Query()返回的所有數據,然后在內存中進行選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.