【问题标题】:How to propagate a parameter for joins in a ORM如何在 ORM 中传播连接参数
【发布时间】:2015-04-23 15:27:56
【问题描述】:

这是sequel of a question I asked before。到目前为止,我试图实施的模式演化问题的策略是缓慢变化的维度。我现在遇到的问题如下。考虑以下数据模型:

class Bar
{
    int id;
    int param;

    double x;
    double y;
}

class Foo
{
    int id;
    int param;

    string name;
    string description;

    collection<Bar> bars;
}

class Delta
{
    int id;
    int param;

    double rating;
}

class RootEntity
{
    int id;
    int param;

    collection<Foo> foos;
    collection<Delta> deltas;
}

注意,所有实体都有int param 属性。它具有相同的名称,但不是外键。 这是一个非常简化的模型,仅作为示例。考虑到集合是巨大的,而对象树要复杂得多。在 EntityFramework 技术中 我可以这样做:

  class MyDbContext : DbContext
  {
        public DbSet<RootEntity> rootEntities { get; set; }
  }

我想要做的是限制param 的选择。可以如下

dbContext.rootEntities.Where(e => e.param == some_value);

问题是在生成的 SQL 代码中只有 dbContext.rootEntities 会被过滤。其余部分(与 Foo、Bar 和 Delta 的连接)不会被过滤。 因此问题来了:如何将.Where(e =&gt; e.param == some_value) 传播到所有连接以进行基础对象选择?

我正在寻找 EntityFramework 或 NHibernate 的解决方案。

谢谢。

【问题讨论】:

    标签: c# entity-framework nhibernate orm


    【解决方案1】:

    使用 NHibernate,您可以像这样对每个表使用 Filter

    public class FooMap : ClassMap<Foo>
    {
        ApplyFilter("Param", "param = :paramValue");
    }
    
    public class BarMap : ClassMap<Bar>
    {
        ApplyFilter("Param", "param = :paramValue");
    }
    
    public class XyzMap : ClassMap<Xyz>
    {
        // This can be the (abstract?) base class map
        ApplyFilter("Param", "param = :paramValue");
    }
    

    在您通过会话调用任何实体之前启用过滤器:

    Session.EnableFilter("Param").SetParameter("paramValue", objValue);
    

    【讨论】:

    • 谢谢,我们试试看。
    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2020-05-18
    • 2018-04-08
    • 2022-01-20
    • 2012-01-08
    相关资源
    最近更新 更多