2017-12-06 11 views
0

다음은 장면 뒤에 숨어있는 것들입니다. 위의 엔티티와 관련된 DbSet에 포함 된 DbSet에 필터를 추가 하시겠습니까?

public class User : BaseTransactionModel 
{ 
    public Guid UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class Transaction 
{ 

    public int TransactionId { get; set; } 
    public string TransactionName { get; set; } 
    public int TransactionHistoryId { get; set; } 

    public virtual TransactionHistory TransactionHistory { get; set; } 
} 

public class TransactionHistory 
{ 
    public int TransactionHistoryId { get; set; } 
    public DateTime CreatedDateTime { get; set; } 
    public Guid UserId { get; set; } 
    public int TransactionId { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
    public virtual ICollection<Transaction> Transactions { get; set; } 
} 

public class BaseTransactionModel 
{ 

    public int TransactionHistoryId { get; set; } 
    public int TransactionId { get; set; } 

    public virtual TransactionHistory TransactionHistory { get; set; } 
    public virtual Transaction Transaction { get; set; } 
} 

, 내가 지정한 날짜에 사용자에서 모든 거래를 얻기 위해 노력하고 있어요.

:

Context.Transaction 
    .Include(t => t.User) 
    .Include(t => t.TransactionHistory) 
    ... 

나는 경우 거래 내역 엔티티의 날짜에서 거래를 필터링 절을 추가하고 싶었 :

는 그래서 거래 DbSet에 사용자TransactionHistory 모두를 포함하여 시도

Context.Transaction 
    .Include(t => t.User) 
    .Include(t => t.TransactionHistory) 
    .Where(t => t.TransactionHistory.CreatedDateTime <= StartDateFilter && t.TransactionHistory.CreatedDateTime >= EndDateFilter) 

하지만 그렇게 할 수 없었습니다. TransactionHistory는 엔터티 목록 (또는 호출 된 항목)이기도합니다.

달성하려는 솔루션을 얻을 수있는 방법은 무엇입니까?

PS : 저는 EF를 처음 접했고 제목이 오도 될 수 있습니다. 그렇다면 언제든지 업데이트하십시오.

+0

그들이에되어있는 것처럼 당신의 모델 클래스가 보이지 않습니다. 관계를 클래스에서 정의해야하는 방식 (탐색 속성 포함)을 연구합니다. – Nikolaus

+0

@Nikolaus 위의 샘플 수업에 대한 불만 사항을 수정했습니다. 제안을 주셔서 감사합니다. 나는 그것에 대해 살펴 보겠습니다. –

답변

-1

이 시도 대신

Context.Transaction 
    .Where(t => t.TransactionHistory.CreatedDateTime <= StartDateFilter && t.TransactionHistory.CreatedDateTime >= EndDateFilter) 
.Select(x=> new {x.User,x.TransactionHistory}); 

또는이

Context.Transaction 
.Where(t => t.TransactionHistory.CreatedDateTime <= StartDateFilter && t.TransactionHistory.CreatedDateTime >= EndDateFilter) 
.Include(t => t.User) 
.Include(t => t.TransactionHistory) 
+0

잘못된 NavigationProperties로 인해 작동하지 않습니다. – Nikolaus

0
당신은 예를 들어, 클래스 디자인을 재고해야 할 수도 있습니다

var result = Context.User 
       .Where(u => u.UserId == myguid) 
       .Select(t => new 
       { 
        UserId = t.UserId, 
        Transactions = t.TransactionHistory.Where(x => x.CreatedDateTime >= StartDateFilter && x.CreatedDateTime <= EndDateFilter) 
       }) 
       .ToList(); 
+0

"수업 설계를 다시 생각해 볼 필요가 있습니다"... 이것이 해결책 중 하나 일 수 있음을 알고 있지만 누군가하기 때문에 수행하고 싶지 않습니다. 내가 탐구하려고 노력하고있는 다른 프로젝트와 그 클래스 모델을 수정하는 것을 피하고 있습니다. 이것 이외의 가능한 해결책이 없다면 그것은 나의 최후의 수단이 될 수 있습니다. –

0

당신이 찾고있는 것은 포함 개체를 필터링 할 수 있습니다 : 당신이 당신의 쿼리가 이런 일이 될 수 필요 같은

public class User 
    { 
     public Guid UserId { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public virtual ICollection<Transaction> TransactionHistory { get; set; } 
    } 

    public class Transaction 
    {  
     public int TransactionId { get; set; } 
     public string TransactionName { get; set; } 
     public DateTime CreatedDateTime { get; set; } 
    } 

그런 다음 거래를 얻을 수 있습니다.

법인 포함 필터링 할 수있는 두 가지 방법이있다 : 나는 야 : 투사를 사용

면책 조항 타사 라이브러리를 사용하여 (@majita 답변을 참조하십시오) 프로젝트 소유자 Entity Framework Plus

EF + Query IncludeFilter는 쉽게 포함 된 항목을 필터링 할 수 있습니다.

라이브러리는 정확하게 투사를 수행합니다.

하나의 제한은 모두 Include이지만 User과 같이 필터가 지정되지 않은 경우에도 IncludeFilter으로 호출 될 수 있습니다.

위키 : EF+ Query Include Filter