2017-12-06 2 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; } 
} 

、私が指定した日にユーザーからすべての取引を取得しようとしています。

だから私はトランザクションDbSetの両方ユーザーTransactionHistory含めて試してみました:

:私は、取引履歴のエンティティの日付からwhere句、そのフィルタのトランザクションを追加したい

Context.Transaction 
    .Include(t => t.User) 
    .Include(t => t.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}); 

ORこの

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

間違ったNavigationPropertiesの原因で、これは動作しません – Nikolaus

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; } 
    } 

:あなたが探しているものを

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

"あなたはクラスデザインを再考する必要があるかもしれません" ...これは解決策の1つであるかもしれませんが、これは誰かのためにやりたいとは思いません私が探究しようとしている他のプロジェクトです。クラスモデルの変更を避けています。これ以外の解決策がない場合は、私の最後の手段になる可能性があります。 –

0

は含まエンティティをフィルタリングできるようにすることです。

フィルタリングするには、2つの方法があり、エンティティが含まれます:サードパーティのライブラリを使用して

投影を使用して
  • (@majitaの回答を参照してください)

免責事項:私はプロジェクトEntity Framework Plus

EF +クエリIncludeFilterの所有者は、容易に含まエンティティをフィルタリングすることができます。

ライブラリーは、正確に投影します。

1つの制限はすべてIncludeですが、Userなどのフィルタが指定されていない場合でもIncludeFilterと呼び出されるようになりました。

ウィキ:EF+ Query Include Filter

関連する問題