C# select r.字段和select new{r.字段}之间的差异
链接到以下两个主题: 及 在第一个主题@xanatos中,评论如下: @Kerezo请注意,新的{r.City}错误出现两次(每次查询一次)。new{r.City}创建一个匿名对象,该对象具有一个名为City的属性,该属性包含City对象(因此您将城市包装在一个对象中),而不使用直接包含城市的新属性 考虑以下代码:C# select r.字段和select new{r.字段}之间的差异,c#,linq,entity-framework,linq-to-sql,c#-4.0,C#,Linq,Entity Framework,Linq To Sql,C# 4.0,链接到以下两个主题: 及 在第一个主题@xanatos中,评论如下: @Kerezo请注意,新的{r.City}错误出现两次(每次查询一次)。new{r.City}创建一个匿名对象,该对象具有一个名为City的属性,该属性包含City对象(因此您将城市包装在一个对象中),而不使用直接包含城市的新属性 考虑以下代码: var citiesToExclude = from r in ent.TestAllStatusEqualsOnes
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}
之间有什么区别。谁能再解释一下
谢谢1-选择r.字段-返回现有类型(例如r.字段=字符串) 2-选择新{r.Field}-返回新的匿名类型对象
希望它能消除疑问。1-选择r.字段-返回现有类型(例如r.字段=字符串) 2-选择新{r.Field}-返回新的匿名类型对象
希望它能澄清疑问。新的{Property=value}语法用于创建(引用具有只读属性的类型,并支持相等和类型重用) 区别在于第一条语句返回
IEnumerable
第二条语句返回IEnumerable
。匿名类型有一个名为City
的属性,其类型为City类型
。如果未按中所述指定属性名称:
new { City = r.City }; // Explicitly-named property called City.
匿名类型采用在中使用的属性的名称:
new { r.City }; // Property called City.
如果匿名类型无法解析名称:
new { "a string" };
您会得到一个编译错误
匿名类型对于构造用于传播到另一个扩展方法或linq语句的另一部分的内联容器非常有用
匿名类型不能声明为类成员,您需要使用
var
来充分利用它们。有智能感知支持。它们也不满足接口定义,只能包含属性。新的{Property=value}语法用于创建(引用具有只读属性的类型,并支持相等和类型重用)
区别在于第一条语句返回IEnumerable
第二条语句返回IEnumerable
。匿名类型有一个名为City
的属性,其类型为City类型
。如果未按中所述指定属性名称:
new { City = r.City }; // Explicitly-named property called City.
匿名类型采用在中使用的属性的名称:
new { r.City }; // Property called City.
如果匿名类型无法解析名称:
new { "a string" };
您会得到一个编译错误
匿名类型对于构造用于传播到另一个扩展方法或linq语句的另一部分的内联容器非常有用
匿名类型不能声明为类成员,您需要使用var
来充分利用它们。有智能感知支持。它们也不满足接口定义,只能包含属性。匿名类型与任何其他类型几乎相同。因此:
select new { r.City }
与以下内容几乎相同:
select new SomeType { City = r.City}
与:
这就使得区别变得简单;这与以下两者之间的区别相同:
string x = obj.City;
及
在一种情况下,您获得的是城市名称。在另一种情况下,您将获得一个对象,该对象具有名为City
的属性,该属性是城市名称(尽管在一般情况下,它也可能具有其他属性)
同样的逻辑也适用于LINQ内部
两者之间的一个方便的区别是考虑null
,例如:
var city = {some query}.FirstOrDefault();
如果您选择的是实际的城市名称,那么很难区分“无行”与“一行,城市名称为空”之间的区别。如果您正在选择一个对象,您可以区分obj==null
vsobj.City==null
匿名类型与任何其他类型几乎相同。因此:
select new { r.City }
与以下内容几乎相同:
select new SomeType { City = r.City}
与:
这就使得区别变得简单;这与以下两者之间的区别相同:
string x = obj.City;
及
在一种情况下,您获得的是城市名称。在另一种情况下,您将获得一个对象,该对象具有名为City
的属性,该属性是城市名称(尽管在一般情况下,它也可能具有其他属性)
同样的逻辑也适用于LINQ内部
两者之间的一个方便的区别是考虑null
,例如:
var city = {some query}.FirstOrDefault();
如果您选择的是实际的城市名称,那么很难区分“无行”与“一行,城市名称为空”之间的区别。如果您正在选择一个对象,则可以区分obj==null
vsobj.City==null