Пользовательский метод расширения LINQ выбрасывает VeriationException: тип аргумента Ienumerable `1 [Entity] 'нарушает оC#

Место общения программистов C#
Ответить
Anonymous
 Пользовательский метод расширения LINQ выбрасывает VeriationException: тип аргумента Ienumerable `1 [Entity] 'нарушает о

Сообщение Anonymous »

У меня есть несколько сущностей, которые выглядят так: < /p>
public class MyEvent
{
// ...
public IEnumerable Encounters { get; set; } // Navigation property
// ...
}

public class MyEncounter
{
public Guid MyEventID { get; set; }
public MyEvent MyEvent { get; set; } // Navigation property

public Guid? MySpecialProperty { get; set; }

public int Status { get; set; }
//...
}
< /code>
Я хочу добавить метод расширения, чтобы сделать некоторую фильтрацию коллекции встреч на Myevent и вернуть значение MyspecialProperty для одного из экземпляров Myencounter (в частности, экземпляра, где статус = 1).public static class MyExtensions
{
public static Guid? GetMySpecialProperty(this IEnumerable encounters)
{
return encounters.Where(e => e.Status == 1)
.Select(e => e.MySpecialProperty)
.FirstOrDefault();
}
}
< /code>
Теперь я готов использовать свой метод расширения. Я значительно упростил это, чтобы удалить вещи, которые должны быть неактуальными: < /p>
var qry = MyEventsContext.
.Where()
.Select(x => new MyViewModel
{
SpecialPropValue = x.Encounters.GetMySpecialProperty()
});
< /code>
Это компилирует, как и ожидалось, и я готов запустить запрос: < /p>
IList items = await qry.ToListAsync();
< /code>
Вот где что -то идет не так. Как только выполняется .tolistasync () , я получаю это исключение:
VerificationException: Method Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor+CustomShaperCompilingExpressionVisitor.PopulateCollection: type argument 'System.Collections.Generic.IEnumerable`1[]' violates the constraint of type parameter 'TCollection'.
< /code>
Внутреннее исключение лишь немного более подробно: < /p>
ArgumentException: GenericArguments[0], 'System.Collections.Generic.IEnumerable`1[]', on 'Void PopulateCollection[TCollection,TElement,TRelatedEntity](Int32, Microsoft.EntityFrameworkCore.Query.QueryContext, System.Data.Common.DbDataReader, Microsoft.EntityFrameworkCore.Query.Internal.ResultCoordinator, System.Func`3[Microsoft.EntityFrameworkCore.Query.QueryContext,System.Data.Common.DbDataReader,System.Object[]], System.Func`3[Microsoft.EntityFrameworkCore.Query.QueryContext,System.Data.Common.DbDataReader,System.Object[]], System.Func`3[Microsoft.EntityFrameworkCore.Query.QueryContext,System.Data.Common.DbDataReader,System.Object[]], System.Func`5[Microsoft.EntityFrameworkCore.Query.QueryContext,System.Data.Common.DbDataReader,Microsoft.EntityFrameworkCore.Query.Internal.ResultContext,Microsoft.EntityFrameworkCore.Query.Internal.ResultCoordinator,TRelatedEntity])' violates the constraint of type 'TCollection'.
< /code>
Что это за исключение, которое говорит мне, и есть ли способ его разрешить? Насколько я могу судить, я правильно создал свой метод расширения.// Extension method
public static IEnumerable GetMySpecialEncounters(this IEnumerable encounters)
{
return encounters.Where(e => e.Status == 1)
}

// Query
var qry = MyEventsContext.
.Where()
.Select(x => new MyViewModel
{
SpecialPropValue = x.Encounters.GetMySpecialEncounters()
.Select(x => x.MySpecialProperty)
.FirstOrDefault()
});
< /code>
< /strike>

Я ошибался в этом выше. Использование этого метода расширения в запросе приводит к этому исключению:
When called from 'VisitLambda', rewriting a node of type 'System.Linq.Expressions.ParameterExpression' must return a non-null value of the same type
< /code>
Что работает, выполняет всю логику внутри запроса, без метода расширения вообще: < /p>
// Query
var qry = MyEventsContext.
.Where()
.Select(x => new MyViewModel
{
SpecialPropValue = x.Encounters.Where(e => e.Status == 1)
.Select(x => x.MySpecialProperty)
.FirstOrDefault()
});


Подробнее здесь: https://stackoverflow.com/questions/643 ... nt-ienumer
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»