在LINQ中使用通用操作时出现NotSupportedException

时间:2017-02-23 12:09:23

标签: c# linq sharepoint linq-to-sharepoint

在工作中,我必须创建一个控制台应用程序,它可以联系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个项目,所以我肯定得到我不想要的东西。

1 个答案:

答案 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();