使用MVC / LINQ以特定格式显示(平)一行数据

时间:2012-07-31 00:17:14

标签: asp.net-mvc linq entity-framework

我的表格的列名类似于“ADDRESS”,“OLD_ADDRESS”,“CITY”,“OLD_CITY”,“STATE”,“OLD_STATE”.....等等。我正在使用实体框架查询提取此信息并将模型传递到ASP.NET MVC视图中。

我需要以表格格式显示此信息,看起来像这样

enter image description here

我需要比较旧字段和新字段,如果值有差异,请显示它。 做这样的事情的最佳方法是什么? 我可以通过循环遍历模型并比较if(item.ADDRESS == item.OLD_ADDRESS){....}来正常构建这个,但是这个特定的表有大约100列,我基本上写50“如果”条件。假设linq查询只返回一行。

我正在从遗留数据库中读取此信息,无法重新设计它。 提前感谢任何建议。

----------------------------- EDIT 1 ---------------- ------------ 这是我到目前为止所尝试的内容 -

@foreach (var BusRels in Model)
           {               
               foreach (var busrel in BusRels.GetType().GetProperties())
               {   
                    if (busrel.Name.IndexOf("OLD") > -1) {                        
                            {
                                var fieldVal = busrel.GetValue(BusRels, null);                                
                                if ( fieldVal != null)
                                {
                                    if (!fieldVal.ToString().Trim().IsEmpty())
                                    {   
                                        <tr>
                                        @{
                                            //BusRels.GetType().GetProperties().Where(p => p.Name == fieldVal.
                                        var displayName = busrel.GetCustomAttributes(typeof(System.ComponentModel.DisplayNameAttribute), false)
                                        .Cast<System.ComponentModel.DisplayNameAttribute>()
                                        .FirstOrDefault().DisplayName;
                                        }

                                        <td>@displayName</td>
                                        <td>@busrel.GetValue(BusRels, null)</td>
                                        <td>???????</td>
                                        </tr>   
                                    }
                                }
                            }
                    }
               }

我想这里的问题是我似乎无法在旧值旁边显示“新”值。

2 个答案:

答案 0 :(得分:2)

您可以使用LINQ获取要显示的值:

var matches = from BusRels in Model
              from busrel in BusRels.GetType().GetProperties()
              where busrel.Name.StartsWith("OLD")
              let fieldVal = busrel.GetValue(BusRels, null)
              where Convert.ToString(fieldVal).IsNullOrWhiteSpace()
              let newval = BusRels.GetType()
                                  .GetProperty(busrel.Name.Replace("OLD_", ""))
                                  .GetValue(BusRels, null)
              where newval.ToString().Trim() != fieldVal.ToString().Trim()
              let displayName = busrel.GetCustomAttributes(typeof(System.ComponentModel.DisplayNameAttribute), false)
                                      .Cast<System.ComponentModel.DisplayNameAttribute>()
                                      .FirstOrDefault().DisplayName
              select new
                     {
                         DisplayName = displayName,
                         NewVal = newval,
                         OldVal = fieldVal
                     };

然后你只需循环并显示它们。

答案 1 :(得分:0)

好吧......有点乱,但看起来好像有效。 如果有人读到这个有更好的方法,我想听听。感谢。

@foreach (var BusRels in Model)
                    {
                        foreach (var busrel in BusRels.GetType().GetProperties())
                        {
                            if (busrel.Name.IndexOf("OLD") > -1)
                            {
                                {
                                    var fieldVal = busrel.GetValue(BusRels, null);
                                    if (fieldVal != null)
                                    {
                                        if (!fieldVal.ToString().Trim().IsEmpty())
                                        {   
                                            var newval = BusRels.GetType().GetProperty(busrel.Name.Replace("OLD_", "")).GetValue(BusRels, null);

                                            //BusRels.GetType().GetProperties().Where(p => p.Name == fieldVal.
                                            var displayName = busrel.GetCustomAttributes(typeof(System.ComponentModel.DisplayNameAttribute), false)
                                            .Cast<System.ComponentModel.DisplayNameAttribute>()
                                            .FirstOrDefault().DisplayName;
                                            var oldval = busrel.GetValue(BusRels, null);


                                            if (newval.ToString().Trim() != oldval.ToString().Trim())
                                            {  
                                            <tr>
                                                <td>@displayName</td>
                                                <td>@newval</td>
                                                <td>@oldval</td>
                                            </tr>   
                                            }
}
                                    }
                                }
                            }
                        }
                    }