返回不同类型列表的方法

时间:2017-02-19 23:26:18

标签: c# asp.net-mvc asp.net-mvc-5 viewmodel

我正在尝试使用MVC 5进行搜索,我得到了逻辑,但我需要的是拥有返回3个不同列表对象的方法

我在MVC 5中有视图模型

public class SearchViewModel
{
    public List<Article> ArticleSearch { get; set; }
    public List<Albums> AlbumsSearch { get; set; }
    public List<Blog> BlogSearch { get; set; }
    public List<PDFModel> PDFSearch { get; set; }
}

在我的控制器中:

public ActionResult Index()
{
    using (DBContext db = new DBContext())
    {
        string xyz = "f";
        var Search = new SearchViewModel()
        {
            AlbumsSearch = helper.Search(db.Albums, xyz) <!-- Here i get error -->
        };
        return View(Search);
    }
}

帮助者。搜索:

public static IList Search(object obj,string SearchString) 
{
    using (DBContext db = new DBContext())
    {
        if (obj is Albums)
        {

            var AlbumSearch = db.Albums.Where(x => x.AlbumName.Contains(SearchString) || 
            x.AlbbumSmallDesc.Contains(SearchString) || x.AlbumNameEnglish.Contains(SearchString)||
                    x.AlbbumSmallDescEnglish.Contains(SearchString)).ToList();

            return AlbumSearch as List<Albums>;
        }
        else if(obj is Article)
        {
            var ArticleSearch = db.Article.Where(x => x.ArticleSubject.Contains(SearchString)||x.ArticleSubjectEnglish.Contains(SearchString)||
                    x.ArticleMessage.Contains(SearchString)||x.ArticleMessageEnglish.Contains(SearchString)).ToList();
             return ArticleSearch;
        }
        else
        {
           return null;
        }
     }
 }

我想制作一个返回列表进行搜索的方法

我收到此错误:

  

无法将类型'System.Collections.IList'隐式转换为'System.Collections.Generic.List&lt; MohamedJibril.Models.Albums&gt;'。存在显式转换(您是否错过了演员?)

2 个答案:

答案 0 :(得分:0)

您可能应该为不同的类使用不同的搜索功能。话虽如此,你可以使用相同的搜索功能和一点点黑客攻击。定义一种扩展方法,将List<T>转换为List<object>。然后从您的方法中返回List<object>

public static class ListExtensions
{
    public static List<Object> ToObjectList<T>(this List<T> list) where T : class
    {
        var objectList = new List<object>();
        list.ForEach(t => objectList.Add(t));
        return objectList;
    }
}

List<object> Search(int i)
    {
        if (i == 0)
        {
            return new List<Album>().ToObjectList();
        }
        else
        {
            return new List<Article>().ToObjectList();
        }          
    }

<强>更新

当您使用这样的扩展方法调用搜索时,您可以转换回来。

public static List<T> FromObjectList<T>(this List<object> list) where T : class
    {
        var result = new List<T>();
        list.ForEach(t => result.Add(t as T));
        return result;
    }

List<Album> albums = Search(0).FromObjectList<Album>();

答案 1 :(得分:0)

该消息非常清楚,您正在尝试将IList转换为IList<T>。您的方法返回前者,您的视图模型具有后者。

您的搜索方法没有任何优势。你有所有那些if语句。如果你需要30种不同的类型,你会做什么,写30种不同的if语句?而是这样做:

public static IList<Album> SearchAlbums(string SearchString)
{
    using (DBContext db = new DBContext())
    {

        var AlbumSearch = db.Albums.Where(x => x.AlbumName.Contains(SearchString) ||
        x.AlbbumSmallDesc.Contains(SearchString) || x.AlbumNameEnglish.Contains(SearchString) ||
                x.AlbbumSmallDescEnglish.Contains(SearchString)).ToList();

        return AlbumSearch;
    }
}

也为其他类型创建相同的方法。