簡體   English   中英

有什么辦法可以延遲-針對IQueryable執行委托 <T> 執行后/執行中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM