gpt4 book ai didi

c# - 将派生属性包含到实体查询的 linq 中

转载 作者:太空狗 更新时间:2023-10-30 01:24:27 27 4
gpt4 key购买 nike

这是一个基于名为 Task 的 Poco 类的简单项目:

class Program
{
static void Main(string[] args)
{
using (MyDbContext ctx = new MyDbContext())
{
// first query
DateTime compareDate = DateTime.Now + TimeSpan.FromDays(3);
var res = ctx.Tasks.Where(t => t.LastUpdate < compareDate).ToList();

// second query
res = ctx.Tasks.Where(t => t.ShouldUpdate).ToList();
}
}
}

public class MyDbContext : DbContext
{
public DbSet<Task> Tasks { get; set; }
}

public class Task
{
public int ID { get; set; }
public DateTime LastUpdate { get; set; }
public bool ShouldUpdate
{
get
{
return LastUpdate < DateTime.Now + TimeSpan.FromDays(3);
}
}
}

我想做的是查询上下文 dbset,包括在 where 子句中的 ShouldUpdate 派生属性。

“第一个查询工作正常”(我不能将它写在一行中,但没关系)。

如您所知,我们在“第二个查询”中收到一个 NotSupportedException,并显示以下消息:LINQ to Entities 不支持指定的类型成员“ShouldUpdate”。仅支持初始化程序、实体成员和实体导航属性。

没错,我能理解为什么会这样,但我需要将派生信息封装在 Task 对象中,这样我就可以在网格中显示该属性或在其他任何地方使用它,而无需复制其背后的逻辑。

有没有聪明的技术可以做到这一点?

注意:ShouldUplate 属性的技术名称是什么?衍生的?计算?计算?

最佳答案

终于我找到了解决方案..您可以将部分查询(表达式)存储在静态文件中并像这样使用它们:

class Program
{
static void Main(string[] args)
{
using (MyDbContext ctx = new MyDbContext())
{
res = ctx.Tasks.Where(Task.ShouldUpdateExpression).ToList();
}
}
}

public class MyDbContext : DbContext
{
public DbSet<Task> Tasks { get; set; }
}

public class Task
{
public int ID { get; set; }
public DateTime LastUpdate { get; set; }
public bool ShouldUpdate
{
get
{
return ShouldUpdateExpression.Compile()(this);
}
}

public static Expression<Func<Task, bool>> ShouldUpdateExpression
{
get
{
return t => t.LastUpdate < EntityFunctions.AddDays(DateTime.Now, 3);
}
}
}

关于c# - 将派生属性包含到实体查询的 linq 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9327438/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com