C# 是否在相关数据库集中包含的数据库集上添加筛选器?
以下是一些幕后的事情C# 是否在相关数据库集中包含的数据库集上添加筛选器?,c#,entity-framework,entity-framework-6,ef-code-first,C#,Entity Framework,Entity Framework 6,Ef Code First,以下是一些幕后的事情 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 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; }
}
我想添加一个where子句,从事务历史记录实体中的日期过滤事务:
Context.Transaction
.Include(t => t.User)
.Include(t => t.TransactionHistory)
.Where(t => t.TransactionHistory.CreatedDateTime <= StartDateFilter && t.TransactionHistory.CreatedDateTime >= EndDateFilter)
Context.Transaction
.Include(t=>t.User)
.Include(t=>t.TransactionHistory)
.Where(t=>t.TransactionHistory.CreatedDateTime=EndDateFilter)
但却无法做到这一点。因为TransactionHistory也是一个实体列表(或其他名称)
有什么可能的解决方案来实现我的目标
附言:我是EF的新手,标题可能会有误导性。如果是这样,请随时更新它。试试这个
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=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)
Context.Transaction
.Where(t=>t.TransactionHistory.CreatedDateTime=EndDateFilter)
.Include(t=>t.User)
.Include(t=>t.TransactionHistory)
您可能需要重新考虑您的课程设计,例如:
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; }
}
公共类用户
{
公共Guid用户标识{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共虚拟ICollection TransactionHistory{get;set;}
}
公共类事务
{
public int TransactionId{get;set;}
公共字符串TransactionName{get;set;}
公共日期时间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();
var result=Context.User
.Where(u=>u.UserId==myguid)
.选择(t=>new
{
UserId=t.UserId,
Transactions=t.TransactionHistory。其中(x=>x.CreatedDateTime>=StartDateFilter&&x.CreatedDateTime您希望能够筛选包含的实体
Context.Transaction
.IncludeFilter(t => t.User)
.IncludeFilter(t => t.TransactionHistory
.Where(x => x.TransactionHistory.CreatedDateTime <= StartDateFilter && x.TransactionHistory.CreatedDateTime >= EndDateFilter))
过滤包含实体的方法有两种:
- 使用投影(参见@majita answer)
- 使用第三方库
免责声明:我是项目的所有者
EF+查询IncludeFilter允许轻松筛选包含的实体
Context.Transaction
.IncludeFilter(t => t.User)
.IncludeFilter(t => t.TransactionHistory
.Where(x => x.TransactionHistory.CreatedDateTime <= StartDateFilter && x.TransactionHistory.CreatedDateTime >= EndDateFilter))
Context.Transaction
.IncludeFilter(t=>t.User)
.IncludeFilter(t=>t.TransactionHistory
.Where(x=>x.TransactionHistory.CreatedDateTime=EndDateFilter))
在引擎盖下,库正好做了一个投影
一个限制是allInclude
,但是现在可以使用IncludeFilter
调用,即使没有指定过滤器,例如用户
Wiki:你的模型类看起来不像是应该的。试着研究一下,类中的关系应该如何定义(带有导航属性)。@Nikolaus我对上面的示例类表示不满。谢谢你的建议,我会确保查看它。“你可能需要重新考虑你的类设计”…我知道这可能是解决方案之一,但我不想这样做,因为这是其他人的项目,我正在尝试探索,我正在避免修改其任何类模型。如果除此之外没有其他可能的解决方案,那么这可能是我的最后手段。由于导航属性错误,这无法工作