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什么是';选择新建&x27;做_C#_Linq - Fatal编程技术网

C# LINQ什么是';选择新建&x27;做

C# LINQ什么是';选择新建&x27;做,c#,linq,C#,Linq,我构建了以下LINQ查询 var activeMembers = from m in context.py3_membershipSet join c in context.ContactSet on m.py3_Member.Id equals c.ContactId where m.statuscode.Value == 1 orderby m.py3_name

我构建了以下LINQ查询

var activeMembers = from m in context.py3_membershipSet
                    join c in context.ContactSet on m.py3_Member.Id equals c.ContactId 
                    where m.statuscode.Value == 1
                    orderby m.py3_name
                    select m;
但后来我看到了一个这样格式化的示例:

var contacts =
(
    from c in xrm.ContactSet
    join a in xrm.AccountSet on c.ParentCustomerId.Id equals a.Id
    where a.Name == "Acme Pty Ltd"
    select new
    {
        Name = c.FullName,
        DOB = c.BirthDate,
        Gender = (c.FormattedValues.Contains("gendercode") ? c.FormattedValues["gendercode"] : "Ambiguous")
    }
);
(我意识到这是一组不同的数据)在这种情况下,包含“选择新”实际上做了什么

与第一个代码块中的示例相比,它有什么好处


我意识到有些人可能会觉得这是一个乏味的问题,但我想学习LINQ,需要快速学习。但我也不想在客户机上运行一些我不完全理解的东西,不管是哪种方式,LINQ都会返回匿名对象的集合<代码>选择新建让我们定义该对象的布局以及该匿名对象中包括哪些属性/属性名称


您还可以使用
selectnewclassname{}
返回您定义的实体类的实例列表。

您正在使用
Queryable.select(IQueryable,Expression)
方法,其中ContactSet是TSource,匿名对象返回类型的类型是TResult。您的代码也可以写成

...Select(r => new { 
                        Name = c.FullName, 
                        DOB = c.BirthDate, 
                        Gender = (c.FormattedValues.Contains("gendercode") ? c.FormattedValues["gendercode"] : "Ambiguous") 
                    })
其中select方法返回匿名类型的集合


另外,由于看起来您正在查询数据库,所以在引擎盖下还有一些事情要做。IQueryable的实现查看您编写的Select方法,并将您提供的表达式转换为有效的SQL,以便它能够检索您返回的匿名对象的所有必要信息。请注意,我说过IQuerable的实现将提供的表达式(而不是函数)转换为sql。Select扩展方法只接受表达式,不接受函数,因为它无法将函数转换为sql

正如前面的答案所指出的,这两种方法都返回匿名类型。完全回答你的问题:“第二句话比第一句话有什么好处?”

第一条语句按原样返回
m
的所有字段。如果您有7个“列”,那么
activeMembers
将包含所有这些列以及它们包含的任何数据

在第二条语句中,您将结果投影到只有3个字段的自定义匿名对象中。不仅如此,您还可以在将“源字段”存储到匿名对象之前对其执行逻辑。这使您可以灵活地将它们存储在容器类中,而无需在代码中实际定义该类

您还可以执行
选择newsomeclass{}
,将结果投影到预定义的类容器中

以下伪代码可能有助于理解差异,也可能没有帮助:

上面的
myQuery
现在是
MyContainer
的集合。如果我省略了类
MyContainer
,那么它将是一个匿名类型的集合,包含我指定的字段。显然,这里的区别在于
MyContainer
必须在代码的其他地方定义,而匿名类是在编译时为您构建/定义的。在:

var myQuery = from p in someContext.someTable
              select p;

myQuery
是一个匿名类,包含
someTable

中的所有字段及其值,除非您使用的是Single或First或Count等运算符,否则Linq返回的是集合,而不是匿名对象。匿名类型指定集合中每个元素的公共成员。因此,从本质上讲,第二个查询将结果限制为具有已知名称的已定义组,而不是未定义的x字段集(如第一个查询)?是和否。第一个查询中的x字段集仍然是“已知的”(至少对编译器而言)。您可以在IDE中通过键入
activeMembers.FirstOrDefault()。
看到这一点,然后会弹出可用字段。第二个选项只是让您能够更好地控制匿名类型的内容、字段的名称,并允许您对字段执行计算。
var myQuery = from p in someContext.someTable
              select p;