1

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

我需要以表格格式显示此信息,如下所示

在此处输入图像描述

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

我正在从旧数据库中读取此信息,无法重新设计它。在此先感谢您的任何建议。

----------------------------- 编辑 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>   
                                    }
                                }
                            }
                    }
               }

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

4

2 回答 2

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
                     };

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

于 2012-07-31T03:51:57.860 回答
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>   
                                            }
}
                                    }
                                }
                            }
                        }
                    }
于 2012-07-31T01:59:21.403 回答