【问题标题】:Selecting list of objects where property of a specific type in entityframework选择实体框架中特定类型属性的对象列表
【发布时间】:2016-01-26 09:45:20
【问题描述】:

目前正在努力过滤这些对象具有继承属性的对象列表(称为字段),该属性称为 FieldReference。这是一个抽象类,所有 Field 对象都有这个属性,但它可以是不同的类型,例如;

DebtorFieldReference

我们要做的是查询属性为 DebtorFieldReference 类型的所有字段,此外,我们还希望过滤此 DebtorFieldReference 对象中名为 DebtorId 的值。

我们尝试了以下sn-p但EF不允许我们强制转换,我们也尝试在GetType上查询但没有成功。

var results = FieldProvider.Get(f => f.FieldOwnerTypeId == (byte)Enum.FieldReferenceType.Debtor && ((DebtorFieldReference)f.FieldReference).DebtorId == message.Reference);

我过去使用 NHibernate 完成此操作没有任何问题,请告诉我我只是做错了,而 EF 在这种方式上并没有受到很大限制:-(

感谢您的帮助。

【问题讨论】:

    标签: entity-framework entity-framework-6


    【解决方案1】:

    经过一些试验和错误后,我实际上得到了它,不完全确定为什么它会起作用,但演员不会,但这是做到这一点的那条线;

    var results = FieldProvider.Get(f => (f.FieldReference as DebtorFieldReference).DebtorId == message.Reference);
    

    换句话说,使用 'as' 而不是强制转换,当涉及空值时,可能会强制转换和 as 表现不同。

    【讨论】:

    • 能否详细说明生成的 SQL 的性能?
    • 您希望我详细说明什么?这是一个相对复杂的数据库设计,因此实际查询(比我在此处发布的更复杂)相当难看,因为有一些联合在起作用(实际上 Field 对象也是一个抽象对象,我们有 IntField、StringField 等)除此之外,它还不错,它对包含 DebtorFieldReference 信息的表进行连接,并检查该表中的 DebtorId 是否具有所需的值。
    • 再看一遍,生成的查询实际上非常丑陋,比我通常从 NHibernate 中得到的 SQL 更糟糕,尽管只选择 DebtorFieldReference 它仍然联合继承树中的其他类型.....这完全没有意义。也许是因为此时我没有 != null 过滤器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多