내부 .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
'ProgramingTip' 카테고리의 다른 글
TypeError : 문자 버퍼 개체가 필요합니다-정수를 텍스트 파일에 저장하는 동안 (0) | 2021.01.07 |
---|---|
ActionBar의 아이콘을 동적으로 변경 (0) | 2021.01.07 |
unittest setUp으로 mock을 사용하는 방법 (0) | 2021.01.07 |
다른 지점에서 tree-ish를`git log`하는 방법은 무엇입니까? (0) | 2021.01.07 |
Git 경고 : push.default가 설정되지 않았습니다. (0) | 2021.01.07 |