【问题标题】:Difference between select r.Field and select new {r.Field}select r.Field 和 select new {r.Field} 的区别
【发布时间】:2012-07-17 10:15:57
【问题描述】:

这两个主题的链接:

Convert Lambda Expression of a query to linq version

return items that all records related to that items have specific conditions

在第一个主题@xanatos 评论说:

@Kerezo 请注意,新的 { r.City } 错误出现两次(每个查询一次)。 new { r.City } 创建一个匿名对象,该对象具有一个名为 City 的属性,其中包含 City 对象(因此您将 City 包装在一个对象中)没有 new 您直接拥有 City

考虑这段代码:

var citiesToExclude = from r in ent.TestAllStatusEqualsOnes
                              where r.Status != 1
                              select r.City;

GridView1.DataSource = citiesToExclude;
GridView1.DataBind();

如果我这样写代码:

var citiesToExclude = from r in ent.TestAllStatusEqualsOnes
                              where r.Status != 1
                              select new { r.City };

GridView1.DataSource = citiesToExclude;
GridView1.DataBind();

一切都是平等的。

我不明白select r.Fieldselect new {r.Field} 之间有什么区别。谁能解释一下?

谢谢

【问题讨论】:

    标签: c# linq entity-framework linq-to-sql c#-4.0


    【解决方案1】:

    匿名类型几乎与任何其他类型相同。所以:

    select new { r.City }
    

    几乎等同于:

    select new SomeType { City = r.City}
    

    与:

    class SomeType { public string City {get;set;} }
    

    那么,这也许使区分变得简单;它与以下之间的区别相同:

    string x = obj.City;
    

    SomeType y = new SomeType { City = obj.City };
    

    在一种情况下,您获得的是城市名称。在另一种情况下,您获得的对象具有一个名为City的属性,城市名称(尽管在一般情况下,它可能具有其他属性也)。

    同样的逻辑也适用于 LINQ。

    两者之间的一个方便的区别是考虑null,例如:

    var city = {some query}.FirstOrDefault();
    

    如果您选择的是实际城市名称,则很难区分“无行”与“一行,城市名称为空”之间的区别。如果您正在选择一个对象,您可以区分obj == nullobj.City == null

    【讨论】:

      【解决方案2】:

      1 - 选择 r.Field - 返回现有类型(例如 r.Field = 字符串)

      2 - 选择新的 {r.Field} - 返回新的匿名类型对象。

      希望它能消除疑虑。

      【讨论】:

        【解决方案3】:

        new { Property = value } 语法用于创建 Anonymous Types(具有只读属性的引用类型以及对相等和类型重用的支持)。

        不同之处在于您的第一条语句返回IEnumerable<City Type>,第二条语句返回IEnumerable<anonymous type>。匿名类型有一个名为City 的属性,类型为City Type。如果未指定属性名称,如下所示:

        new { City = r.City }; // Explicitly-named property called City.
        

        匿名类型采用如下所示的属性名称:

        new { r.City }; // Property called City.
        

        如果匿名类型无法解析名称:

        new { "a string" };
        

        你得到一个编译错误。

        匿名类型对于构造内联容器以传播到另一个扩展方法或 linq 语句的另一部分很有用。

        匿名类型不能声明为类成员,您需要使用var 来充分利用它们。有 IntelliSense 支持。它们也不满足接口定义,只能包含属性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-19
          • 2015-09-10
          • 1970-01-01
          相关资源
          最近更新 更多