在工作中,我必须创建一个控制台应用程序,它可以联系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]。标题==“航班号:”)和(值(System.Collections.Generic.List`1 [System.Int32])。包含([10007] .Survey.Id) == True))不受支持。
在代码中我已经创建了另一个名为surveyIds
的列表,其中包含整数并限制我执行的列表搜索,我想比较附加到Value的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); }
我可以用其他方式吗?我想一气呵成的原因是,如果我不限制搜索,收集只会获得它找到的与标题匹配的前1000个值,而Sharepoint列表目前有超过200,000个项目,所以我肯定得到我不想要的东西。
答案 0 :(得分:1)
正如我在评论中提到的,看起来像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();