Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从日期范围之间的c#列表中搜索对象-面向性能_C#_Asp.net_Linq_Sharepoint_Sharepoint Online - Fatal编程技术网

从日期范围之间的c#列表中搜索对象-面向性能

从日期范围之间的c#列表中搜索对象-面向性能,c#,asp.net,linq,sharepoint,sharepoint-online,C#,Asp.net,Linq,Sharepoint,Sharepoint Online,我使用下面的方法通过LINQ查询查找日期范围之间的对象列表(来自sharepoint列表)。它工作正常,但需要很多时间,可以优化吗 public System.Collections.Generic.List FilterDashboard(字符串StartDate、字符串EndDate、ClientContext ClientContext、SharePointContext spContext) { var src=this.SpHelper.getAllListData(clientCon

我使用下面的方法通过LINQ查询查找日期范围之间的对象列表(来自sharepoint列表)。它工作正常,但需要很多时间,可以优化吗

public System.Collections.Generic.List FilterDashboard(字符串StartDate、字符串EndDate、ClientContext ClientContext、SharePointContext spContext)
{
var src=this.SpHelper.getAllListData(clientContext.ToList();
System.Collections.Generic.List source2=src.Where(委托(行程模型x)
{                        
if(!(System.Convert.ToDateTime(x.StartDate.Date>System.Convert.ToDateTime(EndDate.Date))
{                          
return!(System.Convert.ToDateTime(x.EndDate).Date
如果src有1000个元素,您将StartDate从字符串转换为DateTime的次数是多少。如果你只做一次,效率不是更高吗

此外,还返回一个列表。您确定所有来电者都需要完整的列表吗?是否有些调用方只想知道是否存在任何元素?当然,他们可能只想要第一个元素,或者在屏幕上显示前24个元素。换句话说:返回IEnumerable而不是列表不是更有效吗

如果创建一个LINQ函数,总是考虑返回一个iNeXDIABLE而不是一个列表,特别是如果您不需要列表来创建函数的时候。 现在您忘了告诉我们GetAllListData的返回值,但是让我们假设GetAllListData返回一个IEnumerable的ItenaryModels序列


显然,每个ItenaryModel都至少有一个开始日期和结束日期。您不需要所有的ITenaryModel,您只需要在输入参数startDate和endDate的间隔内开始的那些ITenaryModel,或者换句话说,当property startDate>=输入参数startDate和property endDate时,您将列表项作为一个整体加载到内存中,然后搜索它@Harald Coppoolse已经给出了关于LINQ的所有可能的答案


作为一种替代方法,您可以利用CAML查询来实现这一点。您使用的是
SPHelper
,其内部结构对我来说是陌生的。但您可以使用老式的SharePoint CAML查询来提高性能。

您正在做的是——获取整个列表并对其应用过滤器。是否可以使用DateFilter调用sharepoint,以便API自身返回过滤后的数据。this.SpHelper.getAllListData(clientContext)的返回类型是什么<代码>IQueryable?建议-对于每条记录,您不需要在
StartDate
EndDate
上进行
DateTime
转换。您可以将这两个字符串日期转换为
Where
code语句之前的DateTime对象。但是,它几乎不会提高性能。数据库是否将DateTime存储为DateTime或字符串。您正在做大量工作,将日期时间从字符串转换为日期时间,这可能不是必需的。getAllListData函数将返回什么?您是否可以使用秒表类运行诊断,以查看您的确切减速位置?
IEnumerable<ItenaryModel> FilterDashboard(string textStartDate, string textEndDate, ...)
{
    // TODO: check for non-null textStartDate, textEndDate
    // convert the input dates to DateTime:
    DateTime startDate = DateTime.Parse(textStartDate);
    DateTime endDate = Datetime.Parse(textEndDate);
    // TODO: decide what to do if dates can't be parsed
    // TODO: decide what to do if startDate > endDate?

    IEnumerable<ItenaryModel> itenaryModels = this.SpHelper.getAllListData(clientContext);

    // the easiest is a foreach, alternatively use a LINQ where.
    foreach (var itenaryModel in itenaryModels)
    {
        DateTime itenaryStartDate = DateTime.Parse(itenaryModel.StartDate.Date);
        DateTime itenaryEndDate = DateTime.Parse(itenaryMode.EndDate.Date);
        // TODO: decide what to do if can't be parsed

        if (startDate <= itenaryStartDate && itenaryEndDate <= endDate)
        {
             // put this itenaryModel in the returned enumeration
             yield return itenaryModel;
        }
    }
}
DateTime startDate = DateTime.Parse(textStartDate);
DateTime endDate = Datetime.Parse(textEndDate);
IEnumerable<ItenaryModel> itenaryModels = this.SpHelper.getAllListData(clientContext);

return itenaryModels.Where(itenaryModel =>
           startDate <= DateTime.Parse(itenaryModel.StartDate.Date) &&
           DateTime.Parse(itenaryModel.EndDate.Date) <= endDate);