【问题标题】:what is a projection in LINQ, as in .Select()什么是 LINQ 中的投影,如 .Select()
【发布时间】:2014-06-08 17:44:45
【问题描述】:

我通常进行移动应用程序开发,但并不总是有 .Select。但是,我已经看到它使用了一点,但我真的不知道它做了什么或它是如何做的。有点像

    from a in list select a // a.Property // new Thing { a.Property}

我之所以这么问,是因为当我看到使用 .Select() 的代码时,我对它在做什么感到有点困惑。

【问题讨论】:

    标签: linq projection


    【解决方案1】:

    意思是“映射”。将序列的每个元素映射到转换后的序列。看图之前我还没有理解它的意思。

    这个词的意义从何而来?

    简单地说,数学! https://mathworld.wolfram.com/Projection.html

    【讨论】:

    • 您似乎错过了关于 LINQ 投影的问题。
    • @CLS 我很确定
    【解决方案2】:

    .Select() 来自 LINQ 的方法语法,代码中的 select from a in list select a 用于查询语法。两者都是一样的,查询语法编译成方法语法。

    你可能会看到:Query Syntax and Method Syntax in LINQ (C#)

    投影:

    Projection Operations - MSDN

    投影是指将一个物体变换成一个物体的操作。 新形式通常只包含那些将被 随后使用。通过使用投影,您可以构造一个新类型 这是从每个对象构建的。您可以投影属性并执行 一个数学函数。也可以投影原图 对象而不改变它。

    您可能还会看到: LINQ Projection

    转换查询结果的过程称为 投影。您可以在任何过滤器之后投影查询结果 已应用于更改集合的类型 返回。

    Example from MSDN

    List<string> words = new List<string>() { "an", "apple", "a", "day" };
    var query = from word in words
                select word.Substring(0, 1);
    

    在上面的例子中,只有每个字符串实例的第一个字符被选择/投影。

    您还可以从集合中选择一些字段并创建anonymous type 或现有类的实例,该过程称为投影。

    from a in list select new { ID = a.Id}
    

    在上面的代码中,Id 字段被投影到一个匿名类型中,忽略了其他字段。考虑到您的列表有一个 MyClass 类型的对象,其定义如下:

    class MyClass
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
    }
    

    现在您可以将 IdName 投影到匿名类型,例如:

    查询语法:

    var result = from a in list
                 select new
                     {
                         ID = a.Id,
                         Name = a.Name,
                     };
    

    方法语法

    var result = list.Select(r => new { ID = r.Id, Name = r.Name });
    

    您还可以将结果投影到新类。假设您有这样的课程:

        class TemporaryHolderClass
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
    

    那么你可以这样做:

    查询语法:

     var result = from a in list
                 select new TemporaryHolderClass
                     {
                         Id = a.Id,
                         Name = a.Name,
                     };
    

    方法语法:

    var result = list.Select(r => new TemporaryHolderClass  
                                { 
                                    Id = r.Id, 
                                    Name = r.Name 
                                });
    

    您也可以投影到同一个类,前提是您不尝试投影到为 LINQ to SQL 或实体框架生成/创建的类。

    【讨论】:

      【解决方案3】:

      我的总结是它需要结果(或结果的子集),并允许您快速重组它以在本地环境中使用。

      select 子句产生查询结果并指定 每个返回元素的“形状”或类型。例如,您可以指定 您的结果是否包含完整的客户对象,只是 一个成员,成员的一个子集,或一些完全不同的结果 基于计算或新对象创建的类型。

      来源:http://msdn.microsoft.com/en-us/library/bb397927.aspx

      这有很多可能的用途,但其中一个是使用一个复杂对象,其中许多其他对象包含一个字符串属性——比如Name——并允许您返回一个仅包含条目的枚举Name。我相信您也可以做相反的事情——使用该属性(例如)并在传递一个或多个属性时创建/返回新类型的对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-15
        • 1970-01-01
        • 2023-02-13
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多