我有以下代码从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;
}
它应该是什么类型的?
答案 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表达式