表达式参数引用



我已经创建了一个下载管理器,但就下载管理器存储下载参数而言,它运行良好。

Downloader downloader = new Downloader();
downloader.Add(new List<Query>(){
new Query(dataset.trans_sprzedaz_pozycje, () => dataset.PobierzTransSprzedazPozycja(downloader.Filter)),
new Query(dataset.trans_sprzedaz_rabaty_dodatkowe, () => dataset.PobierzDokumentySprzedazyRabaty(downloader.Filter)),
new Query(dataset.trans_sprzedaz_teksty, () => dataset.PobierzDokumentySprzedazyTeksty(downloader.Filter))
});

但在某些情况下,我需要我的查询来存储参数,所以它应该看起来像:

Downloader downloader = new Downloader();
downloader.Add(new List<Query>(){
new Query(dataset.trans_sprzedaz_pozycje, () => dataset.PobierzTransSprzedazPozycja(query.Filter)),
new Query(dataset.trans_sprzedaz_rabaty_dodatkowe, () => dataset.PobierzDokumentySprzedazyRabaty(query.Filter)),
new Query(dataset.trans_sprzedaz_teksty, () => dataset.PobierzDokumentySprzedazyTeksty(query.Filter))
});

请注意,在第一个代码片段中,我使用下载器。过滤器,在第二秒内我使用(捏造的(查询。滤波器

我知道我可以做这样的结构:

var query = new Query(dsSprzedaz.trans_sprzedaz_pozycje);
query.AddFunc(() => dsSprzedaz.PobierzTransSprzedazPozycja(query.Filter));

但是像这样添加 20-30 个查询会很糟糕。

我尝试了这样的解决方案:

Filter filter;
new Query(dsSprzedaz.trans_sprzedaz_pozycje,() => dsSprzedaz.PobierzTransSprzedazPozycja(filter), out filter),

但它从查询中复制值。筛选器,而不是引用。

//编辑

这是下载器最重要的代码:

private Task Execute()
{
var Tasks = new List<Task>(Queries.Count);
foreach (var query in Queries)
{
var task = query.Execute(CancellationToken);
Tasks.Add(task);
}
return Task.WhenAll(Tasks);
}
private void CreateFilter(List<long> id_list)
{
lock (Data)
{
Data.Clear();
Data.Append("(0");
foreach (var value in id_list)
Data.Append("," + value);
Data.Append(")");
}
}
public string Filter
{
get
{
return Data.ToString();
}
}

和查询:

public class Query
{
DataTable Source;
Func<DataTable> Download;
StringBuilder Data;
public Query(DataTable Source, Expression<Func<DataTable>> Download, out string filter)
{
this.Source = Source;
this.Data = new StringBuilder();
filter = Filter;
this.Download = Download.Compile();
}
public async Task Execute(CancellationToken cancellationToken)
{
try
{
DataTable result = await Task.Run(() => Download());
if (cancellationToken.IsCancellationRequested) return;
Source.Merge(result);
}
catch (Exception) { }
}
private void CreateFilter(List<long> id_list)
{
lock (Data)
{
Data.Clear();
Data.Append("(0");
foreach (var value in id_list)
Data.Append("," + value);
Data.Append(")");
}
}
public string Filter
{
get
{
return Data.ToString();
}
}
}

'

  1. 如果查询应该使用它自己的过滤器,则存储信息(您说您只想使用它的过滤器几次,在其他情况下您想使用 Downloader.Filter(

    public class Query
    {
    DataTable Source;
    Func<string, DataTable> Download;
    StringBuilder Data;
    public bool IsOwnFilter { get; set; }
    public Query(DataTable Source, Func<string, DataTable> Download, bool isOwnFilter = false)
    {
    this.Source = Source;
    this.Data = new StringBuilder();
    this.Download = Download;
    this.IsOwnFilter = isOwnFilter;
    }
    public async Task Execute(strign filter, CancellationToken cancellationToken)
    {
    try
    {
    DataTable result = await Task.Run(() => Download(filter));
    if (cancellationToken.IsCancellationRequested) return;
    Source.Merge(result);
    }
    catch (Exception) { }
    }
    // This is not used in your code
    private void CreateFilter(List<long> id_list)
    {
    lock (Data)
    {
    Data.Clear();
    Data.Append("(0");
    foreach (var value in id_list)
    Data.Append("," + value);
    Data.Append(")");
    }
    }
    public string Filter
    {
    get
    {
    return Data.ToString();
    }
    }
    }
    
  2. 接下来,当您从下载器调用它时,请检查新标志并通过正确的过滤器:

    private Task Execute()
    {
    var Tasks = new List<Task>(Queries.Count);
    foreach (var query in Queries)
    {
    // call Execute with Query filter or Downloader.Filter
    var task = query.Execute(query.IsOwnFilter ? query.Filter : Filter, CancellationToken);
    Tasks.Add(task);
    }
    return Task.WhenAll(Tasks);
    }
    

当您向下载器添加查询时:

Downloader downloader = new Downloader();
downloader.Add(new List<Query>(){
new Query(dataset.trans_sprzedaz_pozycje, (filter) => dataset.PobierzTransSprzedazPozycja(filter)),
new Query(dataset.trans_sprzedaz_rabaty_dodatkowe, (filter) => dataset.PobierzDokumentySprzedazyRabaty(filter)),
new Query(dataset.trans_sprzedaz_teksty, (filter) => dataset.PobierzDokumentySprzedazyTeksty(filter))
});

最新更新