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# 具有匿名类型和用户定义类型的LINQ select查询_C#_Linq_Anonymous Class_Dynamic Binding - Fatal编程技术网

C# 具有匿名类型和用户定义类型的LINQ select查询

C# 具有匿名类型和用户定义类型的LINQ select查询,c#,linq,anonymous-class,dynamic-binding,C#,Linq,Anonymous Class,Dynamic Binding,匿名类在c中具有只读属性。它通常用于在linq select查询中声明,以从数据库中获取特定值。 在我的代码中,我有以下查询。让我困惑的是,使用new语句选择匿名类的新对象。我有一个学生文员的模范班。当我使用模型名时,查询结果允许编辑 var query = (from entity in _tblStudentClerkshipsLog.GetQueryable() where entity.StudentID == intStudentID

匿名类在c中具有只读属性。它通常用于在linq select查询中声明,以从数据库中获取特定值。 在我的代码中,我有以下查询。让我困惑的是,使用new语句选择匿名类的新对象。我有一个学生文员的模范班。当我使用模型名时,查询结果允许编辑

var query = (from entity in _tblStudentClerkshipsLog.GetQueryable()
             where entity.StudentID == intStudentID                             
             select new StudentClerkshipsLogModel
             {
                 StudentClerkshipID = entity.StudentClerkshipID,
                 StudentID = entity.StudentID,
                 ClerkshipID = entity.ClerkshipID,
             }).ToList();
当我在select语句中没有提到“新建后的类型”时,我无法退出。编译器引发错误。同名对象是只读的

var query = (from entity in _tblStudentClerkshipsLog.GetQueryable()
             where entity.StudentID == intStudentID                             
             select new 
             {
                 StudentClerkshipID = entity.StudentClerkshipID,
                 StudentID = entity.StudentID,
                 ClerkshipID = entity.ClerkshipID,
             }).ToList()
我的问题是linq如何以不同的方式绑定about两个查询。两个查询都有动态绑定,或者第一个查询是静态的


谢谢

您遇到的错误与LINQ没有任何关系。您可以在根本不使用LINQ的情况下看到相同的内容:

var anonymous = new { Name = "Fred" };
anonymous.Name = "Joe"; // Error, as properties of anonymous types are read-only
因此,如果要修改LINQ查询获取的对象,则不应使用匿名类型。但是这两个LINQ查询都是静态绑定的——匿名类型在编译时仍然是完全已知的,编译器对它们应用常规类型限制。例如:

var anonymous = new { Name = "Fred" };
Console.WriteLine(anonymous.Foo); // Error: no property Foo
int bar = anonymous.Name; // Error: no conversion from string to int

如果我理解正确,您会想,LINQ提供者如何设置匿名对象的属性,因为它们是真正的只读属性,所以没有任何私有集,只有get only


当您为IQueryable调用Select扩展方法时,它接受类型为expression的表达式I发现以下与LINQ结果的匿名类型结果的差异

结果不可编辑,例如,如果我们为gridview赋值 将是只读的

var query = (from entity in _tblStudentClerkshipsLog.GetQueryable()
             where entity.StudentID == intStudentID                             
             select new 
             {
                 StudentClerkshipID = entity.StudentClerkshipID,
                 StudentID = entity.StudentID,
                 ClerkshipID = entity.ClerkshipID,
             }).ToList()
匿名对象的作用域有问题。无法传递类型 使用另一种方法。定义一个var类型的参数;var必须始终 后面跟着一个初始化表达式

如果您只需要在当前上下文中使用结果进行只读,请使用匿名查询。如果需要生成其他函数,则必须定义对象的类型。新建后的对象类型将使用您希望从结果定义中获得的属性创建,然后使用大括号{}。
不必初始化模型类的所有值。

我无法退出是什么意思?编译器在抱怨什么代码?我怀疑这是你展示的代码。您是否打算稍后修改对象?如果是,请显示代码。我想稍后修改代码。但我需要知道select查询之间的区别,以便选择更好的查询。@JonSkeet:看起来像是打字错误。我无法编辑。它们只是不同而已。一个项目为匿名类型,另一个项目为命名类型。如果以后需要修改对象,则绝对不能使用匿名类型,因为匿名类型上的属性是只读的。这与LINQ没有直接关系…@MuhammadNasir:定义一个更好的标准。我知道这一点,但我想知道LINQ当时是如何处理的,因为查询的工作方式完全不同。我有疑问地提到匿名对象是只读的
{_ => new Person() {Id = _.Id, Name = _.Name}}
{_ => new <>f__AnonymousType0`2(a = _.Id, b = _.Name)}