Загрузка дочерней таблицы с помощью служб LinqToSql и RIA

Я использую LinqToSql в проекте и службы Ria, чтобы представить его как IQueryable. Я хочу отправить свою таблицу Product вместе с ее дочерними таблицами (например, ProductStatus, ProductCategory)

Для этого я использую стандартный

public IQueryable ProductSelect() {

DataLoadOptions loadOpts = new DataLoadOptions();
loadOpts.LoadWith<Product>(p => p.ProductStatus);
loadOpts.LoadWith<Product>(p => p.ProductCategory);
this.DataContext.LoadOptions = loadOpts;

return this.DataContext.Products; }

К сожалению, это создает внутренние соединения, а не левые соединения. В таблицах нет ссылочной целостности (добавить не могу).

Это означает, что если в дочерней таблице нет соответствующей записи, то продукт не будет выбран. Кто-нибудь знает, как изменить это на левое соединение?


person David Burela    schedule 23.09.2010    source источник


Ответы (2)


Как насчет чего-то вроде запроса ниже? Это даст вам анонимный тип, состоящий из 3 свойств. Некоторые из них будут нулевыми, если «левое соединение» произвело бы нулевое значение.

  var products= 
        from p in db.Products
        from pc 
        in db.ProductCategory
             .Where(x => x.Id == p.ProductCategoryId)
             .DefaultIfEmpty()
        from ps 
        in db.ProductStatus
             .Where(x => x.Id == p.ProductStatusId)
             .DefaultIfEmpty()
        select new { Product = p, ProductCategory = pc, ProductStatus = ps} 
person p.campbell    schedule 23.09.2010
comment
@ Дэвид, надеюсь, это все равно помогло бы! - person p.campbell; 23.09.2010

Нашел ответ. В файле DBML, где у меня есть таблицы и ассоциации. Это связано с идентификаторами внешнего ключа.

Если внешний ключ не допускает значения NULL, выполняется внутреннее соединение. если вы сделаете поле допускающим значение NULL, оно выполнит левое соединение.

person David Burela    schedule 23.09.2010