Почему бы не выполнить сортировку запроса по вычисленному столбцу в таблице базы данных после обновления VS 2017 до VS 2019 - PullRequest
0 голосов
/ 07 ноября 2019

После переноса из Visual Studio 2017 в 2019 приложение, над которым я работаю, больше не сортирует по вычисляемому полю (FullName).

Рассчитанное поле объединяет поля LastName и FirstName для формирования поля Fullname,Поле FullName используется для сортировки и заполнения списка SelectList. Все работало как положено в VS 2017 CORE 2.2. Появляется сообщение об ошибке, указывающее, что поле FullName не может быть найдено.

Я не вижу столбца FullName в базе данных (имя таблицы БД - Динамик). Если я закомментирую часть запроса orderby (orderby s.FullName), заполняемую списком SelectList, имена будут расположены не в алфавитном порядке

Перечислено в разделе кода в коде для создания таблицы (Модель)запрос в методе OnPost

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;

namespace PublicTalkSchedule.Models
{
    public class Speaker
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        [Display(Name = "Speaker #:")]
        public int Id { get; set; }

        [Required]
        [Display(Name = "Last Name:")]
        public string spkLastName { get; set; }
        [Required]
        [Display(Name = "First Name:")]
        public string spkFirstName { get; set; }

        [Display(Name = "Email:")]
        public string spkEmail { get; set; }

        [Display(Name = "E/MS:")]
        public string EldMs {get;set;}

        [NotMapped]
        [Display(Name = "")]
        public string FullName { get { return string.Concat(spkLastName + ", "
            + spkFirstName); } }

        [Display(Name = "Companyy:")]
        public string CompName { get; set; }

        [Required]
        public int CompId { get; set; }

        [ForeignKey("CompId")]
        public virtual Congregation Congregation { get; set; }

    }


// query speaker table to get a list of all speakers, insert them into 
//the SelectList (SpkID)
IQueryable<string> spknameQuery = from s in _db.Speaker       
                                  orderby s.FullName
                                  select s.FullName;

SpkId = new SelectList(await spknameQuery.ToListAsync());

Что мне нужно сделать с запросом для сортировки вычисляемого поля. Должен ли быть фактический столбец в базе данных с именем FullName?

1 Ответ

0 голосов
/ 11 ноября 2019

Я проверяю ваш код в следующем примере, и имена в алфавитном порядке:

1.Модель:

public class Speaker
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Display(Name = "Speaker #:")]
    public int Id { get; set; }

    [Required]
    [Display(Name = "Last Name:")]
    public string spkLastName { get; set; }
    [Required]
    [Display(Name = "First Name:")]
    public string spkFirstName { get; set; }
    [NotMapped]
    [Display(Name = "")]
    public string FullName
    {
        get
        {
            return string.Concat(spkLastName + ", "
+ spkFirstName);
            }
        }
    [Display(Name = "Companyy:")]
    public string CompName { get; set; }

    [Required]
    public int CompId { get; set; }

    [ForeignKey("CompId")]
    public virtual Congregation Congregation { get; set; }
}
public class Congregation
{
    [Key]
    public int CompId { get; set; }
    public string CompName { get; set; }
}

2.Index.cshtml:

@page
@model IndexModel

<h1>Index</h1>
<form method="post">
    <input name="companyName" />
    <input type="submit" value="submit" />
</form>
@{
    if (Model.SpkId != null)
    {
        <select name="authorId" asp-items="Model.SpkId"></select>
    }
}

3.Index.cshtml.cs:

public class IndexModel : PageModel
{
    private readonly YourContext _db;

    public IndexModel(YourContext db)
    {
        _db = db;
    }
    public SelectList SpkId { get; set; }

    public void OnGetAsync()
    {
    }
    public async Task OnPostAsync(string companyName)
    {
        IQueryable<string> spknameQuery = from s in _db.Speaker
                                          orderby s.FullName
                                          select s.FullName;

        SpkId = new SelectList(await spknameQuery.ToListAsync());
    }
}

4.Результат: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...