Linq to SQL与固定字段的关联

时间:2010-02-26 10:39:43

标签: linq linq-to-sql associations

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

我有3张桌子:

订单,交付和EmailTemplates。

订单包含许多交货,订单和交货具有状态(整数)字段。

EmailTemplates具有适用的状态和bool IsForDeliveries字段。

我在order.status == emailTemplate.status上有Linq to order for Order-> EmailTemplate,但是我想在关联上添加一个条件,使emailTemplate.IsForDeliveries == false。这是可能的,或者我只需要记得在我访问order.EmailTemplates时检查这种情况吗?

修改

AssociateWith存在问题,因为我还需要对应的Delivery< - > EmailTemplate关联,该关联仅显示e.is_for_delivery == true的模板。

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

1 个答案:

答案 0 :(得分:1)

You can use DataLoadOptions.AssociateWith() for this或者只是在课堂上创建一个额外的属性。由于Order类是局部的,你可以在旁边创建一个方法,然后添加:

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

或者,在创建datacontext时:

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;