从三列连接表中选择不同的

时间:2014-09-08 14:10:12

标签: sql linq entity-framework distinct

我有一个包含3列的ef连接表。我想从其中两个中选择不同的值。

enter image description here

我想通过ResourceId和MetaDataId选择不同的行。 所以我希望它在这种情况下返回行(1,3和4)。 我试过这个:

  ctx.ResourceMetas.Where(a => a.ResourceId == resourceid).Distinct()});

但显然这会从三者中获得明显的价值。我能以某种方式选择从两者中脱颖而出吗?

1 个答案:

答案 0 :(得分:1)

您可以按不同的值进行分组,然后获取剩余的最大值或最小值。

如果您只有一个字段,可以这样做:

ctx.ResourceMetas
   .GroupBy(x=>new{x.ResourceId, x.MetaDataId})
   .Select
   (
       x=>new
       {
           MetaListId = x.Min(m=>m.MetaListId ), 
           ResourceId = x.Key.ResourceId, 
           MetaDataId = x.Key.MetaDataId
       }
   )
   .Where(a => a.ResourceId == resourceid)

但是在一个场景中你想要超过三个的2个字段的不同值,那么你必须这样做:

ctx.ResourceMetas
   .GroupBy(x=>new{x.ResourceId, x.MetaDataId})
   .Select
   (
       x=>new
       {
           MetaListId = x.Where(i=>i.MetaListId == x.Min(m=>m.MetaListId)).FirstOrDefault().MetaListId , 
           OtherField = x.Where(i=>i.MetaListId == x.Min(m=>m.MetaListId)).FirstOrDefault().OtherField  , 
           ResourceId = x.Key.ResourceId, 
           MetaDataId = x.Key.MetaDataId
       }
   )
   .Where(a => a.ResourceId == resourceid)