LINQ加入Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:'object'不包含定义

时间:2016-05-26 08:54:32

标签: c# linq join dynamic asp.net-mvc-5

我正在使用EF6并进行一些LINQ连接,然后将新结构传递给视图。问题是它会抛出Microsoft.CSharp.RuntimeBinder.RuntimeBinderException,因为这些新加入structures are internal

C#

 var carMains = this.DatabaseManager.carClaims.Join(this.DatabaseManager.carConvictions, l => l.request_id, r => r.request_id, (l, r) => new { l.claim_amount, r.conviction_driver }).Take(10);
 return View("CarJoin", carMains.ToList());

查看

@model dynamic
@foreach (var m in Model)
{
    <br>
    <div>@(m.claim_amount ?? "")</div>
     <br>
    <div>@(m.conviction_driver ?? "")</div>
     <br>
}

我认为解决方案的方法是为每个连接创建对象,并且具有强类型视图,这将非常耗时,因为我们正在讨论具有200多个实体的多个数据库模型。

我确信有人已经处于这种状况,并且可能找到了一些耗时少的解决方案。 如何将结构传递给视图而不必明确定义它们?

1 个答案:

答案 0 :(得分:0)

自我排序

枚举之后可以将其强制转换为ExpandoObject,然后查看将很乐意处理动态

在C#中扩展扩展程序

public static class ExtensionMethods
{
    public static ExpandoObject ToExpando(this object obj)
    {
        IDictionary<string, object> expando = new ExpandoObject();
        foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(obj))
        {
            var value = propertyDescriptor.GetValue(obj);
            expando.Add(propertyDescriptor.Name, value == null || new[]
            {
                typeof (Enum),
                typeof (String),
                typeof (Char),
                typeof (Guid),
                typeof (Boolean),
                typeof (Byte),
                typeof (Int16),
                typeof (Int32),
                typeof (Int64),
                typeof (Single),
                typeof (Double),
                typeof (Decimal),
                typeof (SByte),
                typeof (UInt16),
                typeof (UInt32),
                typeof (UInt64),
                typeof (DateTime),
                typeof (DateTimeOffset),
                typeof (TimeSpan),
            }.Any(oo => oo.IsInstanceOfType(value))
                ? value
                : value.ToExpando());
        }

        return (ExpandoObject)expando;
    }
}

然后查询获得额外的.ToList().Select(o => o.ToExpando());,如:

var carMains =
            this.DatabaseManager.GetEntities<carClaims>()
                .Join(this.DatabaseManager.GetEntities<carConvictions>(), l => l.request_id, r => r.request_id, (l, r) => new {l.claim_amount, r.conviction_driver})
                .Take(10)
                .ToList()
                .Select(o => o.ToExpando());
        return View("CarJoin", carMains.ToList());

查看代码根本不会改变。

希望这可以节省你一些时间。