如何使用Linq获取唯一的实体集?

时间:2014-02-28 16:53:20

标签: c# sql linq

我正在尝试将4个课程联系在一起:

  • COMPONENTTYPE
    • ID
    • 名称
    • ...
  • 组件
    • 编号
    • ComponentTypeID
    • ...
  • RigAction
    • ID
    • RigActionTypeID(指向下面的RigActionType)
    • ComponentID(指向上面的组件)
  • RigActionType
    • 名称
    • ...

我正在尝试创建一个列出所有组件类型的表,以及分配给它们的任何操作。 (我无法直接分配操作类型,因为其他属性必须保持唯一)

我正在尝试使用Linq查询基于其类型ID的唯一RigActions列表(以便我没有显示重复的装备操作类型)。这是我到目前为止所做的,但它似乎没有起作用。希望我想要完成的事情是有道理的......

快速备注

我遗漏了我认为与本课程无关的任何内容,如果您需要更多内容,请告诉我,我可以提供整个班级。

我也尝试将其设置为EntitySet,而不是列表,但也无法解决这个问题(如果可能的话,我更喜欢这样做)

public class ComponentType
{
    public List<RigActionType> RigActionTypes = new List<RigActionType>();
    public void GetRigActionTypes()
    {
        this.RigActionTypes = this.Components.SelectMany(component => component.RigActions).GroupBy(a => a.RigActionType).Select(at => at.All()).ToList();
    }
}

我收到此错误消息:

Compiler Error Message: CS1501: No overload for method 'All' takes '0' arguments

2 个答案:

答案 0 :(得分:2)

错误的原因是All如果没有委托表达式就无法使用All(x => x.Something == 1)(例如public void GetRigActionTypes() { this.RigActionTypes = this.Components.SelectMany(component => component.RigActions.RigActionTypes).Distinct().ToList(); } ),但在您的情况下则不需要。

这将获得唯一操作类型的列表:

{{1}}

如果您正在寻找其他内容,请澄清。

答案 1 :(得分:2)

All不是你想要的 - 这个方法有助于验证集合中的所有元素是否满足某些条件。

如果您只想为每个组执行一个操作(即每个操作类型一个操作),您可以使用First作为示例(至少这是我从您的问题描述中获得的):

this.Components.SelectMany(component => component.RigActions)
               .GroupBy(a => a.RigActionType)
               .Select(at => at.First()).ToList();

但是你的属性表明你想拥有所有动作类型的集合,对吧?在这种情况下使用Distinct:

this.RigActionTypes = this.Components.SelectMany(component => component.RigActions)
                                     .Select(a => a.RigActionType)
                                     .Distinct()
                                     .ToList();

或者你可以坚持分组方法:

this.RigActionTypes = this.Components.SelectMany(component => component.RigActions)
                                     .GroupBy(a => a.RigActionType)
                                     .Select(at => at.Key)
                                     .ToList();