我使用这种方法返回什么类型?

时间:2013-04-30 18:25:48

标签: 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.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;
    }

它应该是什么类型的?

4 个答案:

答案 0 :(得分:3)

这是一个匿名类型,因此您无法指定名称。以下任何一种都可以使用:

  • IEnumerable
  • IQueryable
  • IEnumerable<dynamic>
  • IQueryable<dynamic>

但是,我建议您创建一个简单的POCO类来存储您的数据并返回IQueryable<T>

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;
}

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

你可以使用反射作为替代(但它变得丑陋):

static void ContainingMethod()
{
  var anondata = new
  {
    IntegerVal = 1,
    DoubleVal = 2.0D,
    DateTimeVal = DateTime.Now,
    StringVal = "some string"       
  };

  ExternalMethod(anondata);
}

static void ExternalMethod(object data)
{
  // Get the type that was passed in
  Type t = data.GetType();
  // Get a list of the properties
  PropertyInfo[] piList = t.GetProperties();
  // Loop through the properties in the list
  foreach (PropertyInfo pi in piList)
  {
    // Get the value of the property
    object o = pi.GetValue(data, null);
    // Write out the property information
    Console.WriteLine("{0} ({1}): \t{2}", pi.Name, o.GetType(), o.ToString());
  }
}

答案 3 :(得分:0)

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

class Person {

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

}

然后你就可以用Person类型

创建一个linq表达式