Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# select r.字段和select new{r.字段}之间的差异_C#_Linq_Entity Framework_Linq To Sql_C# 4.0 - Fatal编程技术网

C# select r.字段和select new{r.字段}之间的差异

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

链接到以下两个主题:

在第一个主题@xanatos中,评论如下:

@Kerezo请注意,新的{r.City}错误出现两次(每次查询一次)。new{r.City}创建一个匿名对象,该对象具有一个名为City的属性,该属性包含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}
之间有什么区别。谁能再解释一下


谢谢

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
vs
obj.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
vs
obj.City==null