형식이 'System.Linq.Expressions.FieldExpression'인 개체를 'System.Linq.Expressions.ParameterExpression'형식으로 캐스팅 할 수 없습니다.

entity-framework entity-framework-core linq

문제

ASP.NET5. 에서 Entity Framework rc1-final 하고 ASP.NET5.

나는 다음 표를 가지고있다.

public class PlayerComment 
{
    [Key]
    public int Id { get; set; }

    public int? PeriodId { get; set; }

    [ForeignKey("PeriodId")]
    public Period Period { get; set; }

    public int? PlayerId { get; set; }
    [ForeignKey("PlayerId")]
    public Player Player { get; set; 
    public DateTime? CommentDate { get; set; }

    public string Comment { get; set; }

}

PlayerCommentGroup 링크 된 SubGroup 링크 된 Player 에 링크되어 있습니다.

다음 LINQ 쿼리가 있습니다.

public async Task<IEnumerable<PlayerComment>>  SearchQueryable(int? groupId, int? subGroupId = null, int? playerId = null)
    {

        var table = (from pc in _db.PlayerComments
                     join p in _db.Players on pc.PlayerId equals p.Id
                     join sg in _db.SubGroups on p.SubGroupId equals sg.Id
                     where (sg.GroupId == groupId || groupId == null)
                         &&
                         (p.SubGroupId == subGroupId || subGroupId == null)
                           &&
                         (p.Id == playerId || playerId == null)
                     select pc);
        return table.ToListAsync();
    }

이것은 올바르게 작동합니다.

모든 의견은 기간에 포함되므로 내 출력에는 기간을 포함해야하므로 포함 .Include("Period")

그래서 내 코드는 이렇게 보입니다.

public async Task<IEnumerable<PlayerComment>>  SearchQueryable(int? groupId, int? subGroupId = null, int? playerId = null)
    {

        var table = (from pc in _db.PlayerComments
                     join p in _db.Players on pc.PlayerId equals p.Id
                     join sg in _db.SubGroups on p.SubGroupId equals sg.Id
                     where (sg.GroupId == groupId || groupId == null)
                         &&
                         (p.SubGroupId == subGroupId || subGroupId == null)
                           &&
                         (p.Id == playerId || playerId == null)
                     select pc).Include(p => p.Period);
        return table.ToListAsync();
    }

그러나 지금은 런타임 예외를 throw하고 나를 준다 :

"형식 'System.Linq.Expressions.FieldExpression'의 개체를 'System.Linq.Expressions.ParameterExpression'을 입력 할 수 없습니다."

나는 github 에서 OrderBy 에 오류가 있음을 알았지 만 주문을 사용하지는 않는다.

이 문제를 해결할 수있는 해결 방법이 있습니까?

@octavioccl에서 제공 한 답변 덕분에 좁혀진 것 같습니다.

내 코드를 다음으로 변경 :

        var table = _db.PlayerComments.Include(q => q.Period)
                      .Include(sg => sg.Player.SubGroup);
        IQueryable<PlayerComment> tableFiltered;
        if (playerId != null)
        {
            tableFiltered = table.Where(p => p.Player.Id == playerId)
        }
        else
        {
            if (subGroupId != null)
            {
                tableFiltered = table.Where(p => p.Player.SubGroupId == subGroupId)
            }
            else
            {
                if (groupId != null)
                {
                    tableFiltered = table.Where(p => p.Player.SubGroup.GroupId == groupId)
                }
                else
                {
                    tableFiltered = table
                }
            }

        }
        return tableFiltered;

GroupId 선택하고 다른 그룹을 null 유지하는 경우를 제외하고 모든 조합이 작동합니다. SubGroup 작동하기 때문에 Include를 사용하고 where 절 3 단계를 사용할 때만 문제가된다는 것을 추론 할 수 있습니다.

인기 답변

관련된 엔터티를로드 할 DbSet Include 메서드를 호출해야합니다.

 var table = (from pc in _db.PlayerComments.Include(p => p.Period)
              //...

명시 적 조인 대신 탐색 속성을 사용하면 쿼리가 더 간단해질 것이라고 생각합니다.

var table =await _db.PlayerComments.Include(p => p.Period)
                                   .Include(p => p.Player.SubGroup.Group)
                                   .Where(pc=>  ( pc.Player.SubGroup.Group.GroupId == groupId || groupId == null) 
                                             && ( pc.Player.SubGroup.SubGroupId == subGroupId || subGroupId == null)
                                             && ( pc.Player.Id == playerId || playerId == null))
                                   .ToListAsync();

최신 정보

매개 변수가 쿼리 외부에서 null 인지 확인하는 조건을 이동하십시오.

bool groupIdIsNull=groupId == null;
bool subGroupIdIsNull=subGroupId == null;
bool playerIdIsNull= playerId==null;

var table =await _db.PlayerComments.Include(p => p.Period)
                                   .Include(p => p.Player.SubGroup.Group)
                                   .Where(pc=>  ( groupIdIsNull || pc.Player.SubGroup.Group.GroupId.Value == groupId.Value) 
                                             && ( subGroupIdIsNull || pc.Player.SubGroup.SubGroupId.Value == subGroupId.Value )
                                             && ( playerIdIsNull || pc.Player.Id.Value == playerId.Value))
                                   .ToListAsync();



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.