C# 此方法的返回类型是什么?

C# 此方法的返回类型是什么?,c#,linq,linq-to-entities,dynamics-crm-2011,dynamics-crm-online,C#,Linq,Linq To Entities,Dynamics Crm 2011,Dynamics Crm Online,我得到了以下代码,它从CRM返回一组结果,然后我将其绑定到dropDownList: var context = new XrmServiceContext(); var contacts1 = ( from c in context.ContactSet join m in context.py3_membershipSet on c.ContactId equals m.p

我得到了以下代码,它从CRM返回一组结果,然后我将其绑定到dropDownList:

        var context = new XrmServiceContext();
        var contacts1 =
            (
                from c in context.ContactSet
                join m in context.py3_membershipSet on c.ContactId equals m.py3_Member.Id
                where m.statuscode.Value == 1

                orderby c.LastName
                select new
                {
                    ContactId = c.ContactId,
                    FirstName = c.FirstName,
                    LastName = c.LastName,
                    BranchCode = c.py3_BranchArea,
                    Branch = (c.FormattedValues != null && c.FormattedValues.Contains("py3_brancharea") ? c.FormattedValues["py3_brancharea"] : "N/a"),
                    JobTitle = c.JobTitle,
                    Organisation = (c.ParentCustomerId != null ? c.ParentCustomerId.Name : "N/a"),
                    joinedAsCode = c.py3_SOLACEMemberJoinedAs,
                    JoinedAs = (c.FormattedValues != null && c.FormattedValues.Contains("py3_solacememberjoinedas") ? c.FormattedValues["py3_solacememberjoinedas"] : "N/a"),
                    Expertise = (c.py3_SOLACEMemberAreasofExpertise != null && c.py3_SOLACEMemberAreasofExpertise.Trim() != String.Empty ? c.py3_SOLACEMemberAreasofExpertise : "N/a")
                }
            );
但是,我需要将其转换为一个方法,以便调用这组结果,并根据其他条件对返回的数据执行LINQ

我不熟悉使用LINQ和“var”的整个概念来包含结果集,因此我不知道使用哪种类型的方法:

        protected static **something** getContacts()
    {
        var context = new XrmServiceContext();
        var contacts1 =
            (
                from c in context.ContactSet
                join m in context.py3_membershipSet on c.ContactId equals m.py3_Member.Id
                where m.statuscode.Value == 1

                orderby c.LastName
                select new
                {
                    ContactId = c.ContactId,
                    FirstName = c.FirstName,
                    LastName = c.LastName,
                    BranchCode = c.py3_BranchArea,
                    Branch = (c.FormattedValues != null && c.FormattedValues.Contains("py3_brancharea") ? c.FormattedValues["py3_brancharea"] : "N/a"),
                    JobTitle = c.JobTitle,
                    Organisation = (c.ParentCustomerId != null ? c.ParentCustomerId.Name : "N/a"),
                    joinedAsCode = c.py3_SOLACEMemberJoinedAs,
                    JoinedAs = (c.FormattedValues != null && c.FormattedValues.Contains("py3_solacememberjoinedas") ? c.FormattedValues["py3_solacememberjoinedas"] : "N/a"),
                    Expertise = (c.py3_SOLACEMemberAreasofExpertise != null && c.py3_SOLACEMemberAreasofExpertise.Trim() != String.Empty ? c.py3_SOLACEMemberAreasofExpertise : "N/a")
                }
            );

return contacts;
    }

应该是什么类型的

它是匿名类型,所以不能指定名称。以下任何一项都有效:

  • IEnumerable
  • IQueryable
  • IEnumerable
  • IQueryable
但是,我建议创建一个简单的POCO类来存储数据,并返回一个
IQueryable

public class GetContactsResult
{
    public long ContactId { get; set; }
    public string FirstName { get; set; }
    ...
}

protected static IQueryable<GetContactsResult> getContacts()
{
    ...
    var contacts =
        (from c in context.ContactSet
         ...
         select new GetContactsResult()
         {
             ...
         });
    return contacts;
}
公共类GetContactsResult
{
公共长联系人ID{get;set;}
公共字符串名{get;set;}
...
}
受保护的静态IQueryable getContacts()
{
...
var触点=
(来自context.ContactSet中的c)
...
选择新的GetContactsResult()
{
...
});
返回联系人;
}

这是一种匿名类型,因此不能指定名称。以下任何一项都有效:

  • IEnumerable
  • IQueryable
  • IEnumerable
  • IQueryable
但是,我建议创建一个简单的POCO类来存储数据,并返回一个
IQueryable

public class GetContactsResult
{
    public long ContactId { get; set; }
    public string FirstName { get; set; }
    ...
}

protected static IQueryable<GetContactsResult> getContacts()
{
    ...
    var contacts =
        (from c in context.ContactSet
         ...
         select new GetContactsResult()
         {
             ...
         });
    return contacts;
}
公共类GetContactsResult
{
公共长联系人ID{get;set;}
公共字符串名{get;set;}
...
}
受保护的静态IQueryable getContacts()
{
...
var触点=
(来自context.ContactSet中的c)
...
选择新的GetContactsResult()
{
...
});
返回联系人;
}

匿名类型专门设计为仅在创建它们的上下文中使用。虽然可以使用几种不同的技术之一返回匿名类型,但无论您做什么,都会导致编译器验证的静态类型丢失,并且(在大多数情况下)还会导致性能下降


到目前为止,最简单、最有效、最简单、最不容易出错的解决方案是创建一个新的命名类型,而不是依赖于匿名类型。一旦创建了一个新的简单类型,其中每个字段都有属性,您就可以选择该类型的新实例,而不是匿名实例。

匿名类型专门设计为仅在创建它们的上下文中使用。虽然可以使用几种不同的技术之一返回匿名类型,但无论您做什么,都会导致编译器验证的静态类型丢失,并且(在大多数情况下)还会导致性能下降


到目前为止,最简单、最有效、最简单、最不容易出错的解决方案是创建一个新的命名类型,而不是依赖于匿名类型。一旦创建了一个新的简单类型,其中每个字段都有属性,您就可以选择该类型的新实例,而不是匿名实例。

匿名类型有一个方法作用域。这意味着,如果在包含方法边界之外传递匿名类型,则必须将其强制转换为对象。这意味着您唯一的选择是使用对象作为返回类型

您可以使用反射作为替代方案(但它越来越难看):


匿名类型具有方法作用域。这意味着,如果在包含方法边界之外传递匿名类型,则必须将其强制转换为对象。这意味着您唯一的选择是使用对象作为返回类型

您可以使用反射作为替代方案(但它越来越难看):


由于这是一种匿名类型,我建议您为此创建一个类,例如:

class Person {

private int age;
private String name;
private String address;
//theirs respective getters and setters

}

然后您就可以创建一个具有Person类型的linq表达式,因为这是一个匿名类型,我建议您为此创建一个类,例如:

class Person {

private int age;
private String name;
private String address;
//theirs respective getters and setters

}

然后你就可以创建一个具有Person类型的linq表达式了

Ok,但正如我所说的,我对这一点相当陌生,所以你的答案对我来说几乎没有任何价值。但是,谢谢你花时间回答。@Phillhealy投入时间和精力去理解你问题的答案。说一个答案对你来说一文不值,直接让你的问题对你(或我们)来说一文不值。我同意p.s.w.g关于制作一个明确的poco类而不是一个anonymous@PhillHealey我试着在我的答案中添加足够的信息,让它更清楚。好的,但正如我所说,我对这一点相当陌生,所以你的回答对我来说几乎毫无价值。但是,谢谢你花时间回答。@Phillhealy投入时间和精力去理解你问题的答案。说一个答案对你来说一文不值,直接让你的问题对你(或我们)来说一文不值。我同意p.s.w.g关于制作一个明确的poco类而不是一个anonymous@PhillHealey我已经试着在我的答案中添加足够的信息,让它更清楚。好的,我想我理解这一点。但是,我如何在我的场景范围内创建命名类型呢?谢谢。@PhillHealey与创建其他类的方法相同<代码>公共类MyClassName{public int ContactId{get;set;}/*…*/}好的,我想我明白了。但是,我如何在我的场景范围内创建命名类型呢?谢谢。@PhillHealey与创建其他类的方法相同<代码>公共类MyClassName{public int ContactId{get;set;}/*…*/}谢谢。这听起来很有趣,但可能是幼稚意味着我还不知道怎么做。谢谢。这听起来很有趣,但可能天真意味着我还不知道怎么做。