0

在工作中,我必须制作一个控制台应用程序,它可以联系 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 == "Flight number:") 和 (value(System.Collections.Generic.List`1[System.Int32]).Contains([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); }

我可以以其他方式做到这一点吗?我想一次性完成的原因是,如果我不限制搜索,则 Collection 只会获得它找到的与标题匹配的前 1,000 个值,并且 Sharepoint 列表目前有超过 200,000 个项目,所以我确信得到我不想要的东西。

4

1 回答 1

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();
于 2017-02-23T12:50:08.593 回答