c # использовать функцию универсального типа с ViewModel - PullRequest
0 голосов
/ 17 июня 2019

Возможно ли это?Я стараюсь избегать большого копирования и вставки из области в область.У меня есть функция поиска (я уменьшил код для простоты).

if (!String.IsNullOrEmpty(filterVM.searchString))
            {
                var nameSearch = filterVM.searchString.ToLower();
                guests = guests.Where(g => g.FirstName.ToLower().StartsWith(nameSearch)
                || g.LastName.ToLower().StartsWith(nameSearch)
                )
            }

            filterVM.FilteredResultsCount = guests.CountAsync();

Гости могут переходить из области в область, но в ней всегда одни и те же базовые вещи, такие как FirstName и LastName, например:

public class GuestBasicBase
    {

        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public string GuestGuid { get; set; } = Guid.NewGuid().ToString();

        public string FirstName { get; set; }

        public string LastName { get; set; }
}

Тогда у меня может быть больший класс для конкретной области, такой как

 public class AreaOneGuest : GuestBasicBase
    {
        public int ID {get; set;}
        public string ExtraFieldOne { get; set; }    
        public string ExtraFieldTwo { get; set; }    
//Etc    
        }

Я хотел бы иметь функцию, которая будет возвращать модель представления, и часть этой модели представления - это PaginatedList, а другаячасть - это параметры фильтра, например:

public class GuestBasicBaseIndexVM
    {
        public PaginatedList<T:GuestBasicBase> Guests  { get; set; } 

        public GuestIndexFilterVM FilterVM { get; set; }
    }

И я хочу, чтобы функция возвращала это, но принимала поле большего размера, например

public async Task<GuestBasicBaseIndexVM>(T:GuestBasicBase, GuestIndexFilterVM filterVM){
//do search function
return (T where T: GuestBasicBase)
}

Имеет ли этот вопрос смысл иВозможно?В настоящее время пытаюсь самостоятельно и вижу, что происходит ... Я чувствую, что это что-то вроде PaginatedList класса, но я не уверен

1 Ответ

0 голосов
/ 17 июня 2019

Не совсем то, что я хотел, но вот что я сделал. изменил мою BaseViewModel так:

    public class GuestBasicBaseIndexVM
        {
            public IEnumerable<GuestBasicBase> Guests  { get; set; } 
            //Changed from a PaginatedList

            public GuestIndexFilterVM FilterVM { get; set; }
        }

и эта функция:

public static async Task<GuestBasicBaseIndexVM> CreateUpdatedGuestList(GuestIndexFilterVM filterVM, IQueryable<GuestBasicBase> guests)
{
//Code to search through guests and return filtered list and filters viewmodel
}

Затем, после того, как вернули Ienumaerable основных гостей, я сделал это, чтобы соединить их обратно с AreaOne Гости

var x = await Helpers.CreateUpdatedGuestList(filterVM, guests);
var hsIDs = x.Guests.Select(v => v.GuestGuid).ToHashSet(); //Filtered GuestGuids to hashset

areaOneGuests = guests.Where(g => hsIDs.Contains(g.GuestGuid)) //This matches up the filtered list of base guests to the actual full guests.
//Then whatever code to do what I want with the AreaOne Guests....

Это было не совсем то, что я пытался сделать, но все же спасает меня от копирования и вставки из области в область с аналогичными базовыми классами Guest. Не смогли измерить какие-либо заметные потери / выигрыш в производительности, делая это таким образом.

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