2015-06-09 3 views
1

Получил словарь с идентификатором личности в качестве ключа. И каждое значение представляет собой List с классом, который содержит дату и время.Linq to SQL replace .Any() with .Contains()

Я хочу получить все контракты из базы данных, где каждая дата в списке находится между контрактами от и до -date. Для каждого человека может быть несколько.

Невозможно использовать. Любой() функция. Если я это сделаю, я получу эту ошибку: «Локальная последовательность не может использоваться в LINQ to SQL-реализации операторов запросов, кроме оператора Contains()».

Это пример с помощью метода .Any, который не работает с linq в sql. И мне нужен другой способ справиться с этим.

public class SimpleObject 
    { 
     public bool Test { get; set; } 
     public DateTime DateTime { get; set; } 
    } 

    private void Test(Dictionary<int, List<SimpleObject>> dataBaseObjDictionary) 
    { 
     using (var db = TpContext.Create()) 
     { 
      var selectedObj = db.Contracts.Where(x => dataBaseObjDictionary.ContainsKey(x.PersonRef) && dataBaseObjDictionary.Values.Any(y => y.Any(a => x.FromDate <= a.DateTime) && y.Any(a=>a.DateTime >= x.UntilDate))); 
     } 
    } 
+0

Я думаю, что LINQ к SQL не знаю, как перевести метод ContainsKey к SQL, попробуйте переписать dataBaseObjDictionary.ContainsKey (x.PersonRef) в dataBaseObjDictionary.Keys.Contains (x.PersonRef). – Oleg

+0

Я бы даже сделал еще один шаг и постараюсь сделать запрос LINQ максимально простым, так что есть меньше, что может пойти не так: 'int [] keys = dataBaseObjDictionary.Keys.ToArray(); ... .Where (x => keys.Contains (x.PersonRef) ... '. Я не знаю, изменит ли это, но я знаю с Entity Framework, я видел, как он жалуется на время выполнения Аналогичные вещи, поэтому вам нужно просто поддерживать LINQ. –

+0

Сделал редактирование на мой вопрос. Дело в том, что я не могу использовать метод .Any(). Он вызывает у меня ошибку. – thatsIT

ответ

0

Я думаю, что это должно быть сделано. Похоже, вы полагались на y, чтобы быть одинаковым с двумя y.anys. Кроме того, вы проверяли, было ли это больше, чем до даты и больше, чем с даты, поэтому я исправил их.

var selectedObj = db.Contracts.Where(x => dataBaseObjDictionary.ContainsKey(x.PersonRef) 
       && dataBaseObjDictionary.Values.Any(
       y => y.Any(a => x.FromDate <= a.DateTime 
         && a.DateTime <= x.UntilDate) 
         ) 
       ); 
+0

Но я не могу использовать. Любая функция при работе с БД. Я получаю эту ошибку: «Локальная последовательность не может использоваться в реализации операторов запросов LINQ to SQL, кроме оператора Contains().» – thatsIT

+0

Можете ли вы использовать .Count> 0? Также эта ошибка не Я хочу, чтобы это было правильно. Я знаю, что это проблема. Может быть, это ContainsKey. – Bob

+0

Пробовал это тоже, но unfortunatley нет! То же самое и мне нужно использовать. Я сделаю еще одно решение с более крупным запросом вместо фильтра по датам , – thatsIT