从日期范围之间的c#列表中搜索对象-面向性能
我使用下面的方法通过LINQ查询查找日期范围之间的对象列表(来自sharepoint列表)。它工作正常,但需要很多时间,可以优化吗从日期范围之间的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
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);