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