如何查询实体框架中的非映射属性?

Posted

技术标签:

【中文标题】如何查询实体框架中的非映射属性?【英文标题】:How to query against non-mapped property in Entity Framework? 【发布时间】:2015-11-27 03:24:35 【问题描述】:

我正在使用此处找到的过程 (Convert value when mapping) 通过封装转换映射属性的类型。就像@Mykroft 所说,这会阻止您针对数据库编写 LINQ 查询。

使用下面的示例属性,我如何告诉 Linq to Entities 在编写语句 db.Employee.Where(b => b.IsActive); 时使用 IsActiveBool ?

[Column("IsActive")]
protected string IsActiveBool  get; set; 

[System.ComponentModel.DataAnnotations.Schema.NotMapped]
public bool IsActive

    get  return IsActiveBool == "Y"; 
    set  IsActiveBool = value ? "Y" : "N"; 

【问题讨论】:

【参考方案1】:

使用db.Employee.Where(b => b.IsActive); 的简单示例,您可以这样写:

db.Employee.ToList().Where(b => b.IsActive);

请记住,这将拉回Employee 表中的所有行,然后在 IsActive 上进行过滤。如果您希望 SQL Server 为您进行过滤(您应该这样做,因为这对于任何实际大小的表都不是一个好的解决方案),那么您需要将其编写为:

db.Employee.Where(b => b.IsActiveBool == "Y");

【讨论】:

这并不是真正的解决方案。它展示了一种将所有内容都放入内存的不良做法,以及一种适用于狭窄示例但不适用于 OP 所示示例的替代方法。 @TravisJ 好吧,也许我没有尽可能明确地说这不是一个好的解决方案(我认为这很明显),但这就是我添加第二个选项的原因。 . 虽然第二个选项是硬编码的,但这个问题要求一种方法来使用抽象的逻辑。我会假设现实世界的实现比所示的简单示例更复杂。 @TravisJ,不,您假设这是目标,但这仅在链接的问题中。我在当前问题中没有看到任何内容表明 == "Y" 不是可接受的解决方案。 "在编写语句 db.Employee.Where(b => b.IsActive); 时,我如何告诉 Linq to Entities 使用 IsActiveBool b>”。我认为它明确指出,虽然IsActive被写在声明中,但底层使用应该是IsActiveBool

以上是关于如何查询实体框架中的非映射属性?的主要内容,如果未能解决你的问题,请参考以下文章

处理来自 JPA/DAO 实体的结果中的非 DB 映射字段

将只读属性分配给实体框架中的新对象

如何将本机查询的结果集映射到实体中的变量

从 EF 为 PostGresql 生成的查询中的非最佳计数

如何将一个自定义实体映射到实体框架中的某些数据库表?

jpa 实体bean中如何定义非映射字段