2014-12-27 8 views
0

Я пытаюсь вычислить отображение или вызов LINQ в параметре модели ICollection. В частности вот моя модель PurchReq (заявок):Как вы относитесь к собственности ICollection?

public enum FiscalYear 
{ 
    [Display(Name="2013")] 
    LastYear, 
    [Display(Name="2014")] 
    ThisYear, 
    [Display(Name="2015")] 
    NextYear 
} 

public class PurchReq 
{ 
    [Key] 
    public int PurchReqID { get; set; } 
    [Display(Name="Fiscal Year")] 
    public FiscalYear FiscalYear { get; set; } 
    //[ForeignKey("Project")] 
    //public int ProjectID { get; set; } 
    [Required] 
    [Display(Name="Purchase Requisition Number")] 
    public string PurchReqNum { get; set; } 
    public string GLCode { get; set; } 
    public string Fund { get; set; } 
    public string Division { get; set; } 
    [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 
    [Display(Name = "Purch Req Created")] 
    public DateTime? DateCreated { get; set; } 
    [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 
    [Display(Name = "Purch Req Submitted")] 
    public DateTime? DateSubmitted { get; set; } 

    //many projects to many purchReqs 
    //public virtual Project Project { get; set; } 
    public virtual ICollection<Project> Projects { get; set; } 

    public PurchReq() 
    { 
     DateCreated = System.DateTime.Now; 
     Projects = new HashSet<Project>(); 
    } 

А вот мой PurchReqController для индексного метода:

var purchReqs = from p in db.PurchReqs 
         select p; 

     if (!string.IsNullOrEmpty(searchString)) 
     { 
      purchReqs = purchReqs.Where(s => s.Projects.Any(item => item.Vendor.VendorName.Contains(searchString))); 
     } 
     switch (sortOrder) 
     { 
      case "ProjectName_desc":; 
       purchReqs = purchReqs.OrderByDescending(s => s.Projects); 
        //Any(item => item.Vendor.VendorName).ThenBy(n => n.Project.Description)); 
       break; 
      case "PurchReqNum_desc": 
       purchReqs = purchReqs.OrderByDescending(s => s.PurchReqNum); 
       break; 
      case "PurchReqNum_asc": 
       purchReqs = purchReqs.OrderBy(s => s.PurchReqNum); 
       break; 
      case "FiscalYear_desc": 
       purchReqs = purchReqs.OrderByDescending(s => s.FiscalYear); 
       break; 
      case "FiscalYear_asc": 
       purchReqs = purchReqs.OrderBy(s => s.FiscalYear); 
       break; 
      case "GLCode_desc": 
       purchReqs = purchReqs.OrderByDescending(s => s.GLCode); 
       break; 
      case "GLCode_asc": 
       purchReqs = purchReqs.OrderBy(s => s.GLCode); 
       break; 
      case "Fund_desc": 
       purchReqs = purchReqs.OrderByDescending(s => s.Fund); 
       break; 
      case "Fund_asc": 
       purchReqs = purchReqs.OrderBy(s => s.Fund); 
       break; 
      case "Division_desc": 
       purchReqs = purchReqs.OrderByDescending(s => s.Division); 
       break; 
      case "Division_asc": 
       purchReqs = purchReqs.OrderBy(s => s.Division); 
       break; 
      case "DateCreated_desc": 
       purchReqs = purchReqs.OrderByDescending(s => s.DateCreated); 
       break; 
      case "DateCreated_asc": 
       purchReqs = purchReqs.OrderBy(s => s.DateCreated); 
       break; 
      case "DateSubmitted_desc": 
       purchReqs = purchReqs.OrderByDescending(s => s.DateSubmitted); 
       break; 
      case "DateSubmitted_asc": 
       purchReqs = purchReqs.OrderBy(s => s.DateSubmitted); 
       break; 
      default: 
       purchReqs = purchReqs.OrderBy(s => s.Projects); 
       //purchReqs = purchReqs.OrderBy(s => s.Projects.Any(item => item.Vendor.VendorName)).ThenBy(n => n.Project.Description); 
       break; 
     } 
     return View(purchReqs); 

Контроллер выше бросает ошибку DbSort, потому что он не может сортировать Проекты ICollection, которые понятны. Мне нужно отсортировать коллекцию Projects.Project.Vendor.VendorName. Это первоначально работало, когда PurchaseReq для Project было много-к-одному, но недавно изменилось на многие-ко-многим. Любые советы и помощь будут высоко оценены.

+0

Какая у вас ошибка? – Dan

+0

Я получаю ошибку DBSort для коллекции проектов. Я предполагаю, что это связано с тем, что теперь не так, как обращаться с «объектами проекта» при запуске сортировки. – Aisarang

ответ

0

Попробуйте это:

purchReqs = purchReqs.OrderBy(pr => pr.Projects.Count > 0 ? pr.Projects.First().Vendor.VendorName : "") 
        .ThenBy (pr => pr.Projects.Count > 0 ? pr.Projects.First().Description  : ""); 

Здесь мы используем First вместо Any; он дает нам какой-то подходящий элемент (неважно, что, конечно, но Any просто дает нам логическое значение, и нет ничего другого, что позволяет нам выбрать один в полуслучайном порядке).

В C# 6, вы будете в состоянии сделать что-то вроде этого, я думаю, с помощью нуль-распространяющегося оператора доступа члена:

purchReqs = purchReqs.OrderBy(pr => pr.Projects.FirstOrDefault()?.Vendor?.VendorName) 
        .ThenBy (pr => pr.Projects.FirstOrDefault()?.Description); 

В любом случае, та же структура используется как для сортировки вызовов , предполагая, что свойство Project имеет свойство Описание.

+0

Первый бросил ошибку и попросил меня сделать FirstOrDefault. Затем я использовал FirstOrDefault, но визуализированное представление не имеет ничего в этом конкретном столбце. – Aisarang

+0

Это говорит о том, что мой код не совсем правильно обрабатывает структуру «Проекты». Возможно, вам придется настроить его, но в принципе, если вам нужно «FirstOrDefault», это уже даст вам плохие данные, поэтому поставьте чек, чтобы убедиться, что это не пустая коллекция. Хм, возможно, изменит мою выборку. –

+0

Хммм интересно. Я сделаю именно это и еще раз спасибо за весь ваш вклад. Я ценю время, которое вы принимаете, чтобы помочь мне во всем этом. – Aisarang

0

Я знаю, что я очень поздно в этой теме и не эксперт в MVC, но насколько я понял о заказе коллекций, он работает, беря одно значение и сравнивая его с другим из того же столбца. В принципе, вам нужно выбрать одно поле из нужной коллекции и предоставить его на лямбда OrderBy.

Как просто, как это возможно, он получает вид, как это:

IQueryable purchReq = context.PurchReq.OrderBy(p => p.Projects.Select(pj => pj.Project).FirstOrDefault().Select(v => v.Vendor.VendorName).FirstOrDefault()); 

Если проект имеет 1 п отношения к Vendor, а также заменить

Select(v => v.Vendor.VendorName); 

по

Select(v => v.Vendor).FirstOrDefault().VendorName 

Надеюсь, что это поможет.