2015-09-04 2 views
1

У меня есть существующий запрос LINQ, для которого требуется два правильных объединения, я знаю, как я буду писать его в SQL, но я не уверен в LINQ.Как преобразовать этот запрос SQL в Linq

Это не вопрос о том, как сделать одно соединение в linq. Мне нужны эти два.

рассмотрим следующий псевдо SQL-запрос:

SELECT  [ProjectItem].* 
FROM  [ProjectItem] 
RIGHT JOIN [UserCostingItem] 
ON   [UserCostingItem].[CostingItemID] 
=   [ProjectItem].[ProjectItemID] 
RIGHT JOIN [UserCostingItemType] 
ON   [UserCostingItemType].[CostingItemType] 
=   [ProjectItem].[ProjectItemType] 
WHERE 
(
    [UserCostingItem].[PrimaryKey] IS NOT NULL 
    OR 
    [UserCostingItemType].[PrimaryKey] IS NOT NULL 
) 

Я хочу, чтобы получить записи в таблице Пункт проекта, где есть запись либо в UserCostingItem таблицы или UserCostingItemType таблицы.

В настоящее время я присоединяюсь к одной таблице, но мне нужно право присоединиться к обоим и возвращать только записи, которые существуют в одном из объединений.

вот код, который я до сих пор что только внутреннее присоединение на одном столе:

List<PCProjectItem> projectItems = new List<PCProjectItem>(); 
List<UserCostingItem> userCostingItems = new List<UserCostingItem>(); 
List<UserCostingItemType> userCostingItemTypes = new List<UserCostingItemType>(); 

projectItems = PCProjectItem.GetProjectItems(projectID, sageDatabaseID, PCIntegrationOption); 
userCostingItems = UserCostingItem.GetUserCostingItems(userID, sageDatabaseID, documentType == null ? string.Empty : documentType.Value.ToString()); 
userCostingItemTypes = UserCostingItemType.GetUserCostingItemTypes(userID, sageDatabaseID); 

//If there are no project items or allocations, return a new list now 
if (projectItems.Count == 0 || (userCostingItems.Count == 0 && userCostingItemTypes.Count == 0)) 
{ 
    return new List<PCProjectItem>(); 
} 

//Get the project Items the user has access to only 
return (from PCProjectItem projectItem in projectItems 
     join UserCostingItem userCostingItem in userCostingItems on projectItem.PCCostItemID equals userCostingItem.CostingItemID 
     select projectItem) 
     .Distinct() // Distinct Records 
     .ToList(); // Convert to list 
+0

возможно дубликат [LINQ слева Join and Right Join] (http://stackoverflow.com/questions/4497086/linq-left-join-and-right-join) – user1666620

+0

Не дублируется связанный вопрос. Вопрос в том, как мне сделать два правильных соединения и выбрать запись, относящуюся к любому из них, а не как сделать левое/правое соединение. – WraithNath

+0

Прежде всего - LINQ к чему? EF, SQL, Objects? В любом случае, если вы определяете правильные отношения между вашими сущностями и сопоставлениями с базовыми таблицами, вам не нужно создавать какие-либо объединения. Использование соединений вместо отношений - сильный запах, который предполагает, что объектная модель неверна или что LINQ и ORM используются так, как если бы они были обычными ADO.NET. –

ответ

0

Ну это, кажется, дают результаты, которые мне нужны:

List<PCProjectItem> projectItems = new List<PCProjectItem>(); 
List<UserCostingItem> userCostingItems = new List<UserCostingItem>(); 
List<UserCostingItemType> userCostingItemTypes = new List<UserCostingItemType>(); 

projectItems = PCProjectItem.GetProjectItems(projectID, sageDatabaseID, PCIntegrationOption); 
userCostingItems = UserCostingItem.GetUserCostingItems(userID, sageDatabaseID, documentType == null ? string.Empty : documentType.Value.ToString()); 
userCostingItemTypes = UserCostingItemType.GetUserCostingItemTypes(userID, sageDatabaseID); 

//If there are no project items or allocations, return a new list now 
if (projectItems.Count == 0 || (userCostingItems.Count == 0 && userCostingItemTypes.Count == 0)) 
{ 
    return new List<PCProjectItem>(); 
} 

var results = from PCProjectItem projectItem in projectItems 
       join UserCostingItem userCostingItem in userCostingItems on projectItem.PCCostItemID equals userCostingItem.CostingItemID into costingItemJoin 
       from costItemRec in costingItemJoin.DefaultIfEmpty() 
       join UserCostingItemType userCostingItemType in userCostingItemTypes on projectItem.PCCostItemTypeID equals userCostingItemType.CostingItemTypeID into costingItemTypeJoin 
       from costItemTypeRec in costingItemTypeJoin.DefaultIfEmpty() 
       where costItemTypeRec != null || costItemRec != null 
       select projectItem; 

return results.Distinct().ToList(); 
Смежные вопросы