2013-11-13 4 views
0

Внутри моей модели класса я использую вызов метода IsAlreadyAssigned, следующим образом: -Лучший способ использовать вспомогательные методы модели класса

public partial class DataCenter 
{ 
    public bool IsAlreadyAssigned() 
    { 
     return (TMSRacks.Any() || TMsRouters.Any() || Zones.Any()); 
    } 
} 

Основная цель этого метода помощник, чтобы скрыть кнопку удаления на представлении если объект имеет дочерние записи; следующим образом: -

<td> 
    @Html.ActionLink("Edit", "Edit", new { id= item.ID}) 
    @if (!item.IsAlreadyAssigned()) 
    { 
     <text>|</text> 
     @Ajax.ActionLink("Delete", 
         "Delete", "DataCenter", 
         new { id = item.ID }, 
         new AjaxOptions 
         { 
          Confirm = "Are You sure You want to delete (" + item.Name + ")", 
          HttpMethod = "Post", 
          OnSuccess = "deletionconfirmation", 
          OnFailure = "deletionerror" 
         }) 

    } 
</td> 

Но на мой взгляд, индекс, который показывает 10 записей, в то время, я буду скрывать или отображать ссылку удалить соответствующим образом, так что я должен включать все навигационные свойства, в моем запросе, как следующие: -

public IQueryable<DataCenter> AllFindDataCenters(string q, bool forautocomplete = false) 
{ 
    return from datacenter in tms.DataCenters.Where(a=> (String.IsNullOrEmpty(q)) || (a.Name.ToUpper().StartsWith(q.ToUpper()))) 
     .Include(a=>a.Zones) 
     .Include(a=>a.TMsRouters) 
     .Include(a=>a.TMSRacks) 
     select datacenter; 
} 

Другое мудрое каждая запись на мой взгляд, индекс может сделать не более трех запросов к БД, чтобы проверить, есть ли какие-либо дочерние записи. Итак, я включил все свойства навигации, как показано выше, чтобы реализовать требование скрытия/отображения ссылки удаления. так что есть лучший способ управлять моей логикой, так как мне не нужно отображать какие-либо данные свойств навигации (tmsrouter, tmsfirewalls, zonea), я просто хочу знать, существует ли atleat одна запись или нет? Thanks

+0

любой является наиболее эффективным способом, как на меня .. –

+0

, но в моем случае я должен тянуть все навигационные свойства, чтобы решить, если любое возвращение() true или false .. это проблема. моя проблема не с Any(), она сама .. –

ответ

2

Вместо того, чтобы работать непосредственно с вашими бизнес-моделями, на ваш взгляд, верните модель и сообщите необходимую информацию, например.

public class DataCenterViewModel 
{ 
    ... 
    public bool HasZones { get; set; } 
    public bool HasTmsRouters { get; set; } 
    public bool HasTmsRacks { get; set; } 

    public bool AlreadyAssigned { get { return HasZones || HasTmsRouters || HasTmsRacks; } } 
} 

Тогда в вашем запросе постройте свои модели просмотра. Кроме того, просто FYI, лучше всего работать с более общей конструкцией, например, IEnumerable<T> при передаче материала в представление, IQueryable<T> предлагает вам дополнительно запросить источник данных один раз в представлении.

public IEnumerable<DataCenterViewModel> AllFindDataCenters(string q, bool forautocomplete = false) 
{ 
    return tms.DataCenters.Where(...) 
          .Select(x => new DataCenterViewModel 
             { 
              ... 
              HasZones = x.Zones.Any(), 
              HasTmsRouters = x.TMSRouters.Any(), 
              HasTmsRacks = x.TMSRacks.Any() 
             }) 
          .ToList(); 

} 

Тогда, наконец, на ваш взгляд

<td> 
@Html.ActionLink("Edit", "Edit", new { id= item.ID}) 
@if (!item.AlreadyAssigned) 
{ 
    ... 
} 
</td> 
+0

ya я получил ур точку, но, к сожалению, на данном этапе будет трудно сделать такое серьезное изменение в моем приложении. я мог бы рассмотреть ур подход в дальнейших релизах. но есть ли способ улучшить мой исходный код? –

+0

@johnG Это не главное изменение, которое вы просто заменяете 'DataCenter' для' DataCenterViewModel'. Какие у вас ограничения? Я не могу предложить изменения, если не знаю, каковы ваши ограничения. – James

+0

Ограничение времени и ресурсов. я имею в виду, что мы находимся на наших последних этапах. и я сделал некоторую настройку, и это получилось. поэтому изменить это для нашего 15-го класса контроллера будет непросто. спасибо –

Смежные вопросы