Ошибки Linq в ToList(), Any(), Count(), Sum()

#c# #entity-framework #linq

#c# #entity-framework #linq

Вопрос:

Я получаю следующие ошибки, все они связаны с system.linq. Странно то, что метод, похоже, иногда работает, ошибки происходят не всегда.

Код Count():

 using (var dbContext = new Entities(GlobalStuff.EntityConnection))
{
    heartBeat.NumSlipsInSecurityUploadQueue = dbContext.SecurityUploadQueues.Count();
    heartBeat.NumSlipsInDataStreamQueue = dbContext.DataStreamQueues.Count();
}
  

Свойство SecurityUploadQueues:

 Public ReadOnly Property SecurityUploadQueues() As ObjectSet(Of SecurityUploadQueue)
        Get
            If (_SecurityUploadQueues Is Nothing) Then
                _SecurityUploadQueues = MyBase.CreateObjectSet(Of SecurityUploadQueue)("SecurityUploadQueues")
            End If
            Return _SecurityUploadQueues
        End Get
    End Property

    Private _SecurityUploadQueues As ObjectSet(Of SecurityUploadQueue)
  

Свойство SecurityUploadQueue является объектом EntityObject

Count() Ошибка:

Ошибка при загрузке системы HeartBeat.Исключение InvalidOperationException: последовательность содержит более одного элемента
в System.Linq.Перечисляемый.Одиночный [TSource] (IEnumerable 1 source)
at System.Data.Objects.ELinq.ObjectQueryProvider.<>c__11
1.b__11_3(IEnumerable 1 sequence)
at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable
1 запрос, выражение queryRoot)
в System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Выполните[S](выражение expression)
в System.Linq.Запрашивается.Подсчитайте[TSource](IQueryable`1 источник)
в SettlerService.SettlerService.UploadHeartBeat()

Любой() код:

 var dataToUpload = (from bet in dbContext.DataStreamQueues select bet).Take(200);
if (dataToUpload.Any())
  

Ошибка Any():

Система.Исключение InvalidOperationException: указанное приведение из материализованного типа ‘System.Int32’ в ‘System.Недопустимый тип Boolean’. в System.Data.Обычный.Внутреннее.Материализация.Формирователь.Ошибка при обработке valuereader 1.GetValue(DbDataReader
reader, Int32 ordinal) at lambda_method(Closure , Shaper ) at
System.Data.Common.Internal.Materialization.Coordinator
1.ReadNextElement (формирователь shaper) в System.Data.Обычный.Внутреннее.Материализация.Формирователь 1.SimpleEnumerator.MoveNext()
at System.Linq.Enumerable.Single[TSource](IEnumerable
1 источник) в System.Data.Objects.ELinq.ObjectQueryProvider.<> последовательность c__11 1.<GetElementFunction>b__11_3(IEnumerable 1) в System.Data.Objects.ELinq.ObjectQueryProvider.Выполните один [TResult](IEnumerable 1
query, Expression queryRoot)
at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression)
at System.Linq.Queryable.Any[TSource](IQueryable
1 источник)
в SettlerService.SettlerService.UploadDataStream()

Я немного погуглил и не могу найти много по этой проблеме. Я подумал, что это может быть связано с версией библиотеки system.core (частью которой является system.linq), но не смог увидеть проблему. Я использую .Net 4.7.2

Комментарии:

1. Похоже, вы используете Entity Framework. Похоже, у вас есть некоторые сопоставления EF, на которые необходимо обратить внимание.

2. Вы правы, мы используем Entity Framework 5. Какое сопоставление могло бы вызвать ошибки?

3. Как dbContext.SecurityUploadQueues определяется?

4. Итак, dbcontext определен в первом edmx-файле базы данных, SecurityUploadQueues — это таблица в базе данных

5. Судя по ошибке, похоже, что SecurityUploadQueues свойство является IQueryable , которое уже содержит Expression , и оно может не указывать непосредственно на DbSet<> . Но это трудно сказать без того, чтобы вы не показали код

Ответ №1:

Вторая ошибка подразумевает, что в вашей DataStreamQueues таблице базы данных есть один столбец с типом Int32 , но тип эквивалентного свойства в DataStreamQueues сущности — bool ; поэтому проверьте, совпадают ли все столбцы и типы свойств.
Что касается первого исключения, это немного странно! поскольку это исключение предполагает, что где-то в вашем коде вы вызываете метод Single() для набора, который содержит несколько элементов, и поскольку Single() ожидается только один элемент, он выдает исключение, однако я не вижу никаких вызовов Single() в предоставленном коде.