如何使用LINQ to CRM来填充实体只读字段(ModifiedOn,Createdby等)?

时间:2014-12-23 15:41:23

标签: c# linq dynamics-crm-2013

我试图运行这个简单的查询:

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返回的不仅仅是一个属性,而且还有某种类型的标准

2 个答案:

答案 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的所有属性,但它应该工作并且具有额外的好处,即不必每次都重写属性名称。