Многократное объединение в Entity Framework и включение всех данных - PullRequest
1 голос
/ 10 декабря 2010

Я хочу написать запрос в Entity Framework, который имеет несколько объединений. Единственная проблема состоит в том, что таблицы не связаны с использованием их первичных / внешних ключей (это база данных Umbraco), поэтому я не могу использовать .Include и свойства Navigation.

По сути, я бы хотел выполнить следующий запрос:

select t.*, n.* from cmsContentType t
inner join cmsContentTypeAllowedContentType a on t.nodeId = a.Id
inner join vicinity.DocumentTypeExtendedProperty x on x.UmbracoDocumentTypeId = t.pk
inner join umbracoNode n on n.id = t.nodeId

У меня есть две сущности EF, сопоставленные с cmsContentType и umbracoNode, поэтому я хотел бы, чтобы они заполнялись так, как если бы я выполнял запрос как

var q = from p in cmsContentType.Include("umbracoNode")

Как это можно сделать

Ответы [ 4 ]

2 голосов
/ 14 декабря 2010

Приведенные выше ответы верны.

Однако, чтобы упростить задачу - почему бы не создать представление?

Представление может выполнить те соединения, которые вы хотели, затемLINQ-запрос становится таким же простым, как круговой:

var q = from x in objectContext.myFunkySpecialView
        select x;
1 голос
/ 14 декабря 2010

Функция «Включить» переводит навигационные свойства во внешние объединения.В вашем примере с sql вы фактически используете внутренние объединения, которые легко переводятся в LINQ.LINQ-запрос, опубликованный Devart, абсолютно корректен, однако использование ключевого слова join вместо вложенного из операторов IMHO создает запрос, который практически идентичен исходному запросу SQL.

var q = from t in objectContext.cmsContentType  
        join a in objectContext.cmsContentTypeAllowedContentType on t.nodeId equals a.Id
        join x in objectContext.DocumentTypeExtendedProperty on t.pk equals x.UmbracoDocumentTypeId
        join n in objectContext.umbracoNode on t.nodeId equals n.id
        select new {  
          t = t,  
          n = n  
        };  
1 голос
/ 13 декабря 2010

Попробуйте следующий подход:

var q = from t in objectContext.cmsContentType  
        from a in objectContext.cmsContentTypeAllowedContentType  
        from x in objectContext.DocumentTypeExtendedProperty  
        from n in objectContext.umbracoNode  
        where t.nodeId == a.Id && x.UmbracoDocumentTypeId == t.pk && n.id == t.nodeId  
        select new {  
          t = t,  
          n = n  
        };  

Надеюсь, это поможет.

0 голосов
/ 14 декабря 2010

Попробуйте, это наверняка сработает

var Salary = from SalaryTable in testEntity.Salary 
             from MonthTable in testEntity.Month 
             where SalaryTable.Month == MonthTable.Month1 
             select SalaryTable,

Также имейте в виду, что вы не можете вернуть анонимный тип, т.е. данные из обеих таблиц в одном списке или var, для которых вам нужно создать класссвойства, которые необходимо вернуть, выполнить итерацию по нему и вернуть вновь созданный класс в виде списка, чтобы получить желаемый результат.

...