NotSupportedException при использовании универсальной операции в LINQ

На работе мне нужно создать консольное приложение, которое может связываться со службой WCF на Sharepoint, извлекать некоторые данные из списка и сравнивать их с некоторыми данными из нашей базы данных 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 == "Номер рейса:") И (значение (System.Collections.Generic.List`1[System.Int32]). Содержит ([10007].Survey.Id) == True)) не поддерживается.

Далее в коде я сделал еще один список под названием surveyIds который полон целых чисел и чтобы ограничить поиск по списку, который я делаю, я хотел сравнить опрос, прикрепленный к идентификатору значения (так как это поиск) с теми, что в моем 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 ответ

Решение

Как я уже упоминал в комментариях, похоже, что поставщик запросов 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();
Другие вопросы по тегам