【问题标题】: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"; }
}

【问题讨论】:

    标签: c# linq entity-framework ef-code-first linq-to-entities


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多