LINQ'选择新'做什么?

Phi*_*ley 3 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
                    select m;
Run Code Online (Sandbox Code Playgroud)

但我已经看到一个格式如下的示例:

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")
    }
);
Run Code Online (Sandbox Code Playgroud)

(我意识到这是一组不同的数据)在这种情况下,包含'select new'实际上做了什么?

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

我意识到有些人可能会觉得这是一个乏味的问题,但我想学习LINQ并且需要快速学习它.但我也不想在客户端实时CRM上运行一些我不完全理解的东西

Ada*_*her 5

无论哪种方式,LINQ都会返回一组匿名对象. select new让我们定义该对象的布局以及该匿名对象中包含的属性/属性名称.

您还可以使用select new ClassName { }返回您定义的实体类的实例列表.

  • Linq返回一个集合,而不是匿名对象,除非您使用的是Single或First或Count之类的运算符.匿名类型指定该集合中每个元素的公共成员. (2认同)

Kit*_*124 5

如先前的答案所述,这两种方法都返回匿名类型。但是要完全回答您的问题:“第二个语句比第一个语句有什么好处?”

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

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

您也可以这样做select new SomeClass { },将结果投影到预定义的类容器中。

以下伪代码可能有助于也可能不帮助理解区别:

var myQuery = from p in someContext.someTable
              group p by p.someField into g
              select new MyContainer {
                  Field1 = g.Sum(a => a.field1)
                  Field2 = g.Max(a => a.field2)
              };
Run Code Online (Sandbox Code Playgroud)

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

var myQuery = from p in someContext.someTable
              select p;
Run Code Online (Sandbox Code Playgroud)

myQuery是一个匿名类,包含中的所有字段及其值someTable

  • 是的,没有。第一个x字段的集合仍然是“已知的”(至少对于编译器而言)。您可以在IDE中输入“ activeMembers.FirstOrDefault()”来看到这一点,然后会弹出可用字段。第二个选项仅使您能够更好地控制匿名类型,字段的名称,并允许您对字段进行计算。 (2认同)