2014-12-09 9 views
0

내 문제는 설명하기가 약간 어렵 기 때문에 나와 함께 감당할 수있는 최선의 방법을 설명하고 가능한 한 많은 정보를 제공 할 것입니다.두 개의 IQueryables에 합류하기

[Table("Items")] 
public class Item : BaseModel 
{ 
    [Key] 
    [Column("Id")] 
    public Guid Id { get; set; } 

    [Column("DescriptionId")] 
    public Guid DescriptionId { get; set; } 

    [ForeignKey("Id")] 
    public LanguageText LanguageText { get; set; } 

    [ForeignKey("DescriptionId")] 
    public LanguageText DescriptionText { get; set; } 
} 



[Table("Shops")] 
[Serializable] 
public class Shop: BaseModel 
{ 
    [Key] 
    [Column("Id")] 
    public Guid Id { get; set; } 

    [Column("ItemId")] 
    public Guid? ItemId{ get; set; } 

    [Column("Closed")] 
    public DateTime? Closed{ get; set; } 

    [ForeignKey("ItemId")] 
    public Item ItemModel{ get; set; } 
} 

내 쿼리

var items= itemRepository.GetAll() 
         .Include(x => x.LanguageText) 
         .Include(x => x.DescriptionText); 




var querableShops = shopRepository.GetAll() 
         .Where(x =>!x.Closed.HasValue || (x.Closed.HasValue && x.Closed.Value >= Expiration)) 
         .GroupJoin(items, s => s.ItemId, i => i.Id, (x, y) => x); 

내 쿼리를 수행 할 때 재미있는 일이 발생합니다

그래서 나는 두 개의 테이블이있다. querableShops를 디버그하고 ItemModel을 체크 아웃하려고 할 때 항목의 결과보기를 먼저 확장하지 않으면 null입니다. 이 때문에 항목을 데이터 그리드에 표시하지 않습니다. 단, 사전에 디버그 할 때 항목을 수동으로 확인하지 않는 한. 문제는 내 항목이 IQueryable, IEnumerable로 변환하려고했지만 그 중 하나는 내 문제를 해결하지 못했다고 생각합니다.

+0

'GetAll'은 어떻게됩니까? 그리고 저장소는 동일한 맥락을 공유합니까? –

+0

GetAll()은 DBSet을 반환합니다. 예 저장소는 동일한 컨텍스트에 있습니다. –

+0

프로젝트에서 지연로드가 활성화되어 있으므로 열심히로드해야하므로 ToList()로 변환하면 도움이됩니다. (x => x.LanguageText) . –

답변

0

ToList()를 호출하여 결과를 열거합니다.

+0

내가 마지막 문장에서 말했듯이, 나는 그것을 시도했다. –

+0

쿼리에서 항목을 열거 할 수 없으므로 ToList를 항목 쿼리와 함께 사용하려고하면 마지막 쿼리와 함께 toList를 사용할 때 뭔가를 얻어야합니다. –

+0

나는 다음과 같은 오류가 발생하면 : 'Namespace.Item'형식의 상수 값을 만들 수 없습니다. 이 문맥에서는, 원시 형 또는 열거 형만이 지원되고 있습니다. –

0

(x, y) => x으로는 상점에서만 상점을 선택하고 검색어는 표시하지 않기 때문입니다. EF는 쿼리의 일부인 엔티티가 최종 결과에 실제로 차이가 있는지 항상 확인하려고합니다. 그렇지 않은 경우 무시됩니다. 그들은 결과에 투영되지 않습니다

  1. (가) 외부 조인 조인, 그래서 그들은 어떤 선택적인 효과가없는
  2. 을 설정 -이 경우, items가 있기 때문에 차이를하지 않습니다.

실제로 Shops 만 쿼리하면 생성 된 SQL에서이 테이블에 대한 간단한 쿼리 만 표시됩니다.

GroupJoinInclude과 같지 않습니다. 상점과 상점을 원할 경우 Include 문을 사용하여 상점을 가져와야합니다. 이 저장소 계층의 문제점은 아마도 책임 충돌이 발생한다는 것입니다 (기술적으로, 기술적으로는 그렇지 않습니다).