Linq to SQL Ассоциации с фиксированными полями - PullRequest
1 голос
/ 26 февраля 2010

Linq to SQL, в конструкторе dbml (или иным образом)

У меня есть 3 таблицы:

Заказы, доставки и шаблоны электронной почты.

Заказы имеют много поставок, а заказы и поставки имеют поле статуса (int).

Шаблоны электронной почты имеют статус, к которому они относятся, и поле bool IsForDeliveries.

У меня есть ассоциации Linq to sql для Order-> EmailTemplate на order.status == emailTemplate.status, но я хочу добавить условие для ассоциации, такое, что emailTemplate.IsForDeliveries == false. Возможно ли это, или мне просто нужно помнить, чтобы проверять это условие каждый раз, когда я обращаюсь к заказу. Электронные шаблоны?

Редактировать

AssociateWith проблематичен, потому что мне также нужна соответствующая ассоциация Delivery <-> EmailTemplate, которая показывает только шаблоны с e.is_for_delivery == true.

Добавление свойства в класс проблематично, потому что я хотел бы, чтобы это было переведено в SQL.

1 Ответ

1 голос
/ 26 февраля 2010

Вы можете использовать DataLoadOptions.AssociateWith() для этого или просто создать дополнительное свойство в классе.Так как класс 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;
...