ProgramingTip

내부 .NET Framework 데이터 공급자 오류 1025

bestdevel 2021. 1. 7. 21:27
반응형

내부 .NET Framework 데이터 공급자 오류 1025


IQueryable<Organization> query = context.Organizations;

Func<Reservation, bool> predicate = r => !r.IsDeleted;

query.Select(o => new { 
    Reservations = o.Reservations.Where(predicate)
}).ToList();

이 쿼리는 "내부 .NET Framework 데이터 공급자 오류 1025"를 던져하지만 아래 쿼리는 말할 것입니다.

query.Select(o => new { 
    Reservations = o.Reservations.Where( r => !r.IsDeleted)
}).ToList();

올바른 술어를 구성하기 위해 몇 가지 경우 문을 확인해야합니다. 이 상황에서 만약 문을 사용할 수있는 것을 전달합니다.

첫 번째 쿼리가 작동하도록 비용을 지불해야합니까?


위의 답변은 사실이지만 문 나중에 사용할 때 AsQueryable()명시 적으로 호출 해야합니다. 그렇지 않으면 컴파일러는 우리가 Func및하지 을 예상하는 IEnumerable을 메서드를 사용하려고한다고 가정합니다 Expression<Func>.

않으면 컴파일러가 오는가가 찾고있는 대부분의 time-을 불평 할 것이다 이것은 아마 원래 포스터의 문제가 있었다 Expression<Func>하지 Func.

도장 : 다음은 실패합니다.

MyContext.MySet.Where(m => 
      m.SubCollection.Select(s => s.SubItem).Any(expr))
         .Load()

다음이 작동하는 동안 :

MyContext.MySet.Where(m => 
      m.SubCollection.Select(s => s.SubItem).AsQueryable().Any(expr))
         .Load()

현상금 (쥐!)을 만든 후이 답변을 찾았고 문제가 해결되었습니다. (내 문제 .Any()는이 질문보다 조금 더 복잡한 전화와 관련 이 있습니다 ...)

간단히 말해서 답은 다음과 가능합니다.

IQueryable<Organization> query = context.Organizations;

Expression<Func<Reservation, bool>> expr = r => !r.IsDeleted;

query.Select(o => new { Reservations = o.Reservations.Where(expr) })
  .ToList();

지역 변수가 필요한 이유에 대한 설명은 참조 expr해독 다른 반환 유형 메서드를 직접 참조 할 수 없습니다 Expression<Func<Reservation, bool>>.


핑 해주셔서 감사합니다. 결국 내가 올바른 길을 가고 생각합니다.

어쨌든, LINQ to Entities ( 주석 에서 내 생각 과정에서 헷갈 렸을 때 나를 수정 해준 Jon Skeet에게 감사드립니다)은 Expression Tree에서 작동합니다 . 그것은 허용 에 의해 SQL에 람다 식을 번역하는 투사QueryProvider .

일반 Func<>LINQ to Objects에서 잘 작동합니다 .

따라서이 경우 Entity Framework를 사용하는 경우 EF에 전달 된 모든 조건 IQueryable자는 Expression<Func<>>.


다른 시나리오 에서이 문제가 발생했습니다.

Expression그런 다음 결합하거나 EF 쿼리에 많은 수있는 조건 자로 가득 찬 정적 클래스가 있습니다. 그중 하나는 다음과 달라집니다.

    public static Expression<Func<ClientEvent, bool>> ClientHasAttendeeStatus(
        IEnumerable<EventEnums.AttendeeStatus> statuses)
    {
        return ce => ce.Event.AttendeeStatuses
            .Where(a => a.ClientId == ce.Client.Id)
            .Select(a => a.Status.Value)
            .Any(statuses.Contains);
    }

Contains메서드 그룹 호출 로 인해 1025 오류가 발생했습니다 . 엔티티 프레임 워크가 Expression을 예상 하고 메소드 그룹을 발견 하여 오류가 발생했습니다. 람다 (암시 적으로 표현식으로 캐스트 될 수 있음)를 사용하도록 코드를 변환하면 오류가 수정되었습니다.

    public static Expression<Func<ClientEvent, bool>> ClientHasAttendeeStatus(
        IEnumerable<EventEnums.AttendeeStatus> statuses)
    {
        return ce => ce.Event.AttendeeStatuses
            .Where(a => a.ClientId == ce.Client.Id)
            .Select(a => a.Status.Value)
            .Any(x => statuses.Contains(x));
    }

곁에 : 그런 다음 식을 단순화하여 ce => ce.Event.AttendeeStatuses.Any(a => a.ClientId == ce.Client.Id && statuses.Contains(a.Status.Value));


비슷한 문제가있었습니다. 다음과 같은 ViewModel 라이브러리 :

public class TagViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }

    public static Expression<Func<SiteTag, TagViewModel>> Select = t => new TagViewModel
    {
        Id = t.Id,
        Name = t.Name,
    };

이것은 작동합니다 :

var tags = await db.Tags.Take(10).Select(TagViewModel.Select)
    .ToArrayAsync();

그러나 이것은 컴파일되지 않습니다.

var post = await db.Posts.Take(10)
    .Select(p => new {
        Post = p,
        Tags = p.Tags.Select(pt => pt.Tag).Select(TagViewModel.Select)
    })
    .ToArrayAsync();

두 번째는 때문에 .Select엉망입니다 - 일반로서 첫 번째 식을 소모하므로 첫 번째는 실제로 된 IQueryable 아닌 ICollection에,의 오프라고 Func하지 Expression<Func.... IEnumerable<...이 페이지에서 설명한 대로을 반환 합니다. 그래서 .AsQueryable()구조를 위해 :

var post = await db.Posts.Take(10)
    .Select(p => new {
        Post = p,
        Tags = p.Tags.Select(pt => pt.Tag).AsQueryable()
            .Select(TagViewModel.Select)
    })
    .ToArrayAsync();

그러나 새롭고 이상한 문제가 발생합니다. 내부 프레임 워크 ... 오류 1025가 발생하거나 완전히로드 된 .Post속성 이있는 게시물 변수가 있지만 .Tags속성에 지연로드에 사용되는 것처럼 보이는 EF 프록시 개체가 있습니다.

해결책은 Anonymous 클래스의 사용을 종료하여 태그의 반환 유형을 제어하는 ​​것입니다.

public class PostViewModel
{
    public Post Post { get; set; }
    public IEnumerable<TagViewModel> Tags { get; set; }

이제 이것을 선택하면 모두 작동합니다.

var post = await db.Posts.Take(10)
    .Select(p => new PostViewModel {
        Post = p,
        Tags = p.Tags.Select(pt => pt.Tag).AsQueryable()
            .Select(TagViewModel.Select)
    })
    .ToArrayAsync();

참조 URL : https://stackoverflow.com/questions/11990158/internal-net-framework-data-provider-error-1025

반응형