【问题标题】:Get objects of certain types获取特定类型的对象
【发布时间】:2013-01-20 07:36:09
【问题描述】:

我正在尝试获取具有某种类型的 E 对象的 Host 对象,如下所示:

return Session.Query<Host>().Where(x => x.E is B).ToList();

这似乎不起作用,可能是因为 E 属于 A 类型,而 B 继承自 A。继承可能是问题所在。更多(简化)细节:

class Host
{
    public A E { get; set; }
}

class B : A
{

}

任何想法为什么上述不起作用?谢谢。

PS:

请注意,以上应该可以工作 - 我使用了错误的类名!

【问题讨论】:

  • 当您说“这似乎不起作用”时,您是说您返回的列表包含Hosts 和Es 是不是 Bs ?
  • 我知道数据库包含 2 个 Host 对象和一个 Host 对象,它有一个 E 对象和一个 B 类对象。上面的 Linq 查询返回 0 个元素。
  • 也许是个愚蠢的问题,但如果您从数据库中检索这两个对象, .EB?可能数据库无法恢复这些信息。
  • 是的,我验证了这一点。这实际上是集成测试的一部分。谢谢。
  • @csetzkorn 是 NHibernate 吗?

标签: c# linq nhibernate inheritance types


【解决方案1】:
return Session.Query<Host>().Where(x => x.E.GetType().Equals(typeof(B)).ToList();

此代码适用于 LinqPad:

void Main()
{
    var x = new Host { E = new B() };

    Console.Write(x.E.GetType().Equals(typeof(B)));
}

class A { }
class B : A { }
class Host { public A E { get; set; } }

【讨论】:

  • 发布了我的 LinqPad-Test...如果这在您的项目中不起作用,请考虑您问题的完整性
  • 好吧,你少了一个括号......现在会检查。
  • @csetzkorn :如果您有生成的查询,我会对它感兴趣。我想知道生成的查询是否会检索整个主机表并进行内存过滤(可能不是问题,具体取决于主机表的大小)对于 Jan P.+1。无论如何
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多