在工作中,我必须制作一个可以在SharePoint上联系WCF服务的控制台应用程序,从列表中删除一些数据,并将其与我们的Microsoft SQL Server数据库中的一些数据进行比较。<<<<<<<<<<<<<<<<<<<<
现在,我几乎把它弄清楚了,但是当试图提取一些我需要的值时,我遇到了一些问题。我需要将两个不同的值放在相同的对象表示中。为此,我必须进行两次相同的查询,但在两个不同的Title
字段标准:
context.Values.Where(i => i.Title.Equals("Flight number:") && surveyIds.Contains(i.Survey.Id) == true).ToList();
context.Values.Where(i => i.Title.Equals("Date") && surveyIds.Contains(i.Survey.Id) == true).ToList();
问题在于,我不能在不获取NotSupportedException
surveyIds.Contains(i.Survey.Id)
表达式(([[10007] .title =="飞行号:")和(value(system.collections.generic.list.1 [system.int32])。包含([10007] .survey.id)== true))不支持。
在代码中进一步添加了另一个名为surveyIds
的列表,该列表中充满了整数,并限制了我所做的列表搜索,我想将附加的调查与值的ID进行比较(因为它是一个查找)我的surveyIds
列表中的那些。
List<FlightSurveysDataContext.SurveysItem> reports = context.Surveys.Where(i => i.Title.Equals("Quality report - Cleaning") && i.UploadComplete == true).ToList();
List<int> surveyIds = new List<int>();
foreach (SurveysItem item in reports) { surveyIds.Add(item.Id); }
我可以以其他方式这样做吗?我想一次这样做的原因是,如果我不限制搜索,该集合只会获得与标题匹配的第一个1,000个值,而SharePoint列表当前有超过200,000个项目,所以我敢肯定要获取我不想要的物品。
正如我在评论中提到的,看起来SharePoint Linq查询提供商不支持常数Contains
表达式。
您可以尝试使用等效的||
条件构建使用以下助手:
public static partial class QueryableExtensions
{
public static IQueryable<T> WhereIn<T, V>(this IQueryable<T> source, Expression<Func<T, V>> valueSelector, IEnumerable<V> values)
{
var condition = values
.Select(value => Expression.Equal(valueSelector.Body, Expression.Constant(value)))
.DefaultIfEmpty()
.Aggregate(Expression.OrElse);
if (condition == null) return source;
var predicate = Expression.Lambda<Func<T, bool>>(condition, valueSelector.Parameters);
return source.Where(predicate);
}
}
用法将是:
var result = context.Values
.Where(i => i.Title.Equals("Flight number:"))
.WhereIn(i => i.Survey.Id, surveyIds)
.ToList();