我试图运行这个简单的查询:
var appt = (from a in context.AppointmentSet
select new Appointment{ ModifiedOn = a.ModifiedOn}).First();
但我收到编译器异常,因为ModifiedOn是readonly。
a
,但之后将返回Appointment
实体的所有属性,而不仅仅是ModifiedOn
。 new { a.ModifiedOn }
,但之后appt将是AnonymousType
而不是Appointment
。建议的方法是什么?
注意,这是一个例子,假设我从Appointment返回的不仅仅是一个属性,而且还有某种类型的标准
答案 0 :(得分:3)
我总是这样做:
var appt = (from a in context.AppointmentSet
select new Appointment {
Attributes =
{
{ "modifiedon", a.ModifiedOn },
{ "createdon", a.CreatedOn },
{ "createdby", a.CreatedBy }
}
})
.First();
它不需要任何额外的编码,我真的很惊讶没有人在这里发布。
答案 1 :(得分:0)
这是我能想到的最有效的方式:
创建一个接受AnonymousType(Object)
的新构造函数public Appointment(object anonymousType) : this()
{
foreach (var p in anonymousType.GetType().GetProperties())
{
var value = p.GetValue(anonymousType);
if (p.PropertyType == typeof(Guid))
{
// Type is Guid, must be Id
base.Id = (Guid)value;
Attributes["opportunityid"] = base.Id;
}
else if (p.Name == "FormattedValues")
{
// Add Support for FormattedValues
FormattedValues.AddRange((FormattedValueCollection)value);
}
else
{
Attributes[p.Name.ToLower()] = value;
}
}
}
然后这样称呼它:
var appt = (from a in context.AppointmentSet
select new Appointment(new { a.ModifiedOn })).First();
它必须反映AnoymousType的所有属性,但它应该工作并且具有额外的好处,即不必每次都重写属性名称。