1

链接到这两个主题:

将查询的 Lambda 表达式转换为 linq 版本

返回与该项目相关的所有记录都具有特定条件的项目

在第一个主题@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.Field我不明白和之间有什么区别select new {r.Field}。谁能解释更多?

谢谢

4

3 回答 3

3

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

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 name。在另一种情况下,您将获得一个对象,该对象具有称为城市名称的属性(尽管在一般情况下,它也可以具有其他属性)。City

相同的逻辑适用于 LINQ。

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

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

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

于 2012-07-17T10:22:36.023 回答
2

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

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

希望它能消除疑虑。

于 2012-07-17T10:18:47.583 回答
2

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

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

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

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

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

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

new { "a string" };

你得到一个编译错误。

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

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

于 2012-07-17T10:22:14.463 回答