2013-06-03 118 views
1

我有一张车辆表,我需要在VehicleAttribute上进行左连接。Linq左加入实体框架

var vehicle = (from v in context.Vehicles 
           //join vehicleAttributes 
           join va in context.VehicleAttributes on v.VehicleId equals va.VehicleId into vAttributes 
           from vehicleAttributes in vAttributes.DefaultIfEmpty() 

           where v.VehicleId == vehicleId 
           select new { v, vehicleAttributes }); 

迄今为止好。 VehicleAttribute也有一个AttributeId列。我只需要加入这些VehicleAttributes当它在这个列表中:

List<Guid> allowedAttributes = (from ua in context.UserAttributes 
                where ua.UserId == UserSession.CurrentUser.UserId 
                select ua.AttributeId).ToList(); 

我该怎么做?我认为子查询可能是正确的方法,但我很挣扎..

感谢您的所有答案。

编辑:一种不同的方法来解释我的问题: 我有这两个查询

SELECT Vehicle.VehicleId,VehicleAttribute.AttributeId 
FROM Vehicle 
LEFT JOIN VehicleAttribute 
ON Vehicle.VehicleId = VehicleAttribute.VehicleId 

SELECT UserAttribute.AttributeId 
FROM UserAttribute 
WHERE UserAttribute.UserId = '4D0F8AD2-7A4D-4E29-A6D3-E5FCD6075388' 

,并希望将它们组合,所以我只得到id属性的这是在第二个查询。 A where子句不起作用,因为即使没有任何属性ID,我仍然需要vehicleId

+4

你更应该使用带有导航属性EF而不是显式连接。我认为你有你的映射设置正确,因为他们没有显示在这里... –

+0

你的第一个代码片段不完整,有未定义的标识符。你能发布整个查询吗? – qJake

+0

当然我更新了我的帖子:-) – Timothy

回答

1

后您定义allowedAttributes你可以改变

vAttributes.DefaultIfEmpty() 
第一个查询的

到:

vAttributes 
    .Where(va => allowedAttributes.Contains(va.AttributeId)) 
    .DefaultIfEmpty() 
0

不确定这是您的情况。你可以试着留下了一个子查询联接:

//define the query that returns allowed VehicleAttributes 
allowedAttributesQuery =from ua in context.UserAttributes 
          where ua.UserId == UserSession.CurrentUser.UserId 
          select ua.VehicleAttribute; //I suppose that VehicleAttribute navigation property exists in the UserAttribute 

//query that joins Vehicles with the allowedAttributes subquery 
var vehicle = (from v in context.Vehicles 
          join va in allowedAttributesQuery on v.VehicleId equals va.VehicleId into vAttributes 
          from vehicleAttributes in vAttributes.DefaultIfEmpty() 

          where v.VehicleId == vehicleId 
          select new { v, vehicleAttributes });