1

我得到了以下代码,它从 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

4 回答 4

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;
}
于 2013-04-30T18:28:32.613 回答
3

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

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

于 2013-04-30T18:29:14.290 回答
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());
  }
}
于 2013-04-30T18:33:08.847 回答
0

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

class Person {

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

}

那么您就可以使用 Person 类型创建一个 linq 表达式

于 2013-04-30T18:53:28.500 回答