1

「ADDRESS」、「OLD_ADDRESS」、「CITY」、「OLD_CITY」、「STATE」、「OLD_STATE」などの列名を持つテーブルがあります。エンティティフレームワーククエリを使用してこの情報を取得し、モデルをASP.NETMVCビューに渡します。

この情報を次のような表形式で表示する必要があります

ここに画像の説明を入力してください

古いフィールドと新しいフィールドを比較する必要があり、値に違いがある場合はそれを表示します。このようなことをするための最良の方法は何ですか?モデルをループしてif(item.ADDRESS == item.OLD_ADDRESS){....}を比較することで、これを通常の方法で構築できますが、この特定のテーブルには約100列あり、基本的に50"if"と記述します。条件。linqクエリから返される行は1つだけであると想定します。

レガシーデータベースからこの情報を読み取っていますが、再設計できません。提案を事前に感謝します。

-----------------------------編集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

OK ...少し面倒ですが、機能しているようです。これを読んでいる人がもっと良いアプローチをしているなら、私はそれを聞きたいです。ありがとう。

@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 に答える