【问题标题】:Linq to SQL Associations with fixed fields具有固定字段的 Linq to SQL 关联
【发布时间】:2013-08-22 03:51:57
【问题描述】:

Linq to SQL,在 dbml 设计器中(或其他)

我有 3 张桌子:

订单、交付和电子邮件模板。

Orders 有很多 Deliveries,Orders 和 Deliveries 有一个 status (int) 字段。

EmailTemplates 有一个它们适用的状态和一个 bool IsForDeliveries 字段。

我在 order.status == emailTemplate.status 上有 Order->EmailTemplate 的 Linq to sql 关联,但我想在关联上添加一个条件,例如 emailTemplate.IsForDeliveries == false。这可能吗,还是我只需要记住在访问 order.EmailTemplates 时检查此条件?

编辑

AssociateWith 是有问题的,因为我还需要对应的 DeliveryEmailTemplate 关联,它只显示带有 e.is_for_delivery == true 的模板。

向类添加属性是有问题的,因为我希望它可以转换为 SQL。

【问题讨论】:

    标签: linq linq-to-sql associations


    【解决方案1】:

    You can use DataLoadOptions.AssociateWith() for this 或者只是在类上创建一个附加属性。由于 Order 类是部分类,您可以在它旁边的部分中创建一个方法,添加以下内容:

    public IEnumerable<EmailTemplate> DeliveryEmailTemplates {
      get { return EmailTemplates.Where(e => e.IsForDeliveries == false); }
    }
    

    或者,在创建数据上下文时:

    var dc = new DataContext();
    var dlo = new DataLoadOptions();
    dlo.AssociateWith<EmailTemplates>(o => o.EmailTemplates.Where(e => e.IsForDeliveries == false));
    dc.LoadOptions = dlo;
    
    var orders = from o in DB.Orders
                 where o.Id == 5
                 select o;
    
    foreach(var o in  orders) {
      //o.EmailTemplates will contain only IsForDeliveries==false...
    }
    

    如果您以静态方式获取 DataContext,则可以每次都添加它,例如,我在 DataContext 的部分类中添加一个名为 .New 的方法:

    public static DataContext New {
      get { 
            var dc = new DataContext(MyConnectionString);
            var dlo = new DataLoadOptions();
            dlo.AssociateWith<EmailTemplates>(o => o.EmailTemplates.Where(e => e.IsForDeliveries == false));
            dc.LoadOptions = dlo;
            return dc;
          }
     }
    

    然后使用:

    var DB = DataContext.New;
    var orders = from o in DB.Orders
                 where o.Id == 5
                 select o;
    

    【讨论】:

    • 嗯...但是如果我还需要等效的 DeliveryEmailTemplate 关联(其中 e.isForDelivery),我不能使用关联(除非我有 2 个不同的上下文工厂)。而且一个方法不能被翻译成SQL...
    • @Greg - 哪种方法不能翻译?我的帖子中没有任何习俗。对于相反的属性,您可以在 Orders 类中添加 2 个属性,也可以将上面的 DeliveryEmailTemplates 反过来。如果它是 IQueryable&lt;T&gt; 而不是 EntitySet&lt;T&gt;,您可以将其作为该类型返回,这取决于您使用它的最佳方式。
    • 投递电子邮件模板。例如: var x = from o in db.orders where o.DeliveryEmailTemplates.Any() select o;我很确定这会给出翻译错误,因为 DeliveryEmailTemplate 是一个属性调用。
    • @Greg - 你能在Order上发布你当前EmailTemplates属性的定义吗?
    • @Nick 它是通过在 dbml 设计器中创建 EmailTemplates 和 Order 之间的关联来自动生成的(就好像 db 中有外键关系一样)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多