c#在ViewModel的泛型类型上使用函数

时间:2019-06-17 04:47:01

标签: c# asp.net-core viewmodel

这可能吗?我试图避免很多区域之间的复制和粘贴。我有一个搜索功能(为简化起见,我减少了代码)。

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,另一部分是Filter参数,如下所示:

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 :(得分:0)

并不是我想要的,但这就是我所做的。像这样更改了我的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
}

然后,当我将基本客人的身份归还后,我执行了此操作以将他们重新连接到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类从一个区域复制到另一个区域的麻烦。用这种方法无法衡量任何明显的性能损失/增益。