Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否在相关数据库集中包含的数据库集上添加筛选器?_C#_Entity Framework_Entity Framework 6_Ef Code First - Fatal编程技术网

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))
在引擎盖下,库正好做了一个投影

一个限制是all
Include
,但是现在可以使用
IncludeFilter
调用,即使没有指定过滤器,例如
用户


Wiki:

你的模型类看起来不像是应该的。试着研究一下,类中的关系应该如何定义(带有导航属性)。@Nikolaus我对上面的示例类表示不满。谢谢你的建议,我会确保查看它。“你可能需要重新考虑你的类设计”…我知道这可能是解决方案之一,但我不想这样做,因为这是其他人的项目,我正在尝试探索,我正在避免修改其任何类模型。如果除此之外没有其他可能的解决方案,那么这可能是我的最后手段。由于导航属性错误,这无法工作