C# 方法返回不同类型的列表

C# 方法返回不同类型的列表,c#,asp.net-mvc,asp.net-mvc-5,viewmodel,C#,Asp.net Mvc,Asp.net Mvc 5,Viewmodel,我试图用MVC5进行搜索,我得到了逻辑,但我需要的是有一个返回3个不同列表对象的方法 我有MVC5中的视图模型 public class SearchViewModel { public List<Article> ArticleSearch { get; set; } public List<Albums> AlbumsSearch { get; set; } public List<Blog> BlogSearch { get; s

我试图用MVC5进行搜索,我得到了逻辑,但我需要的是有一个返回3个不同列表对象的方法

我有MVC5中的视图模型

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; }
}
公共类SearchViewModel
{
公共列表ArticleSearch{get;set;}
公共列表相册搜索{get;set;}
公共列表BlogSearch{get;set;}
公共列表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 ActionResult Index()
{
使用(DBContext db=new DBContext())
{
字符串xyz=“f”;
var Search=newsearchviewmodel()
{
AlbumsSearch=helper.Search(db.Albums,xyz)
};
返回视图(搜索);
}
}
帮助程序。搜索:

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;
        }
     }
 }
公共静态IList搜索(对象对象,字符串搜索字符串)
{
使用(DBContext db=new DBContext())
{
如果(obj是相册)
{
var AlbumSearch=db.Albums.Where(x=>x.AlbumName.Contains(SearchString)|
x、 AlbbumSmallDesc.Contains(搜索字符串)| | x.AlbumNameEnglish.Contains(搜索字符串)||
x、 AlbbumSmallDescEnglish.Contains(SearchString)).ToList();
返回相册作为列表搜索;
}
否则,如果(obj是文章)
{
var ArticleSearch=db.Article.Where(x=>x.ArticleSubject.Contains(SearchString)| | x.ArticleSubjectEnglish.Contains(SearchString)||
x、 ArticleMessage.Contains(SearchString)| | x.ArticleMessageEnglish.Contains(SearchString)).ToList();
返回文章搜索;
}
其他的
{
返回null;
}
}
}
我想创建一个返回列表进行搜索的方法

我得到这个错误:

无法将类型“System.Collections.IList”隐式转换为“System.Collections.Generic.List”。存在显式转换(是否缺少强制转换?)


您可能应该为不同的类使用不同的搜索函数。话虽如此,你也可以使用同样的搜索功能。定义扩展方法以将
列表
转换为
列表
。然后从您的方法返回一个
列表

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();
        }          
    }
公共静态类ListExtensions
{
公共静态列表到对象列表(此列表),其中T:class
{
var objectList=新列表();
ForEach(t=>objectList.Add(t));
返回对象列表;
}
}
列表搜索(int i)
{
如果(i==0)
{
返回新列表().ToObjectList();
}
其他的
{
返回新列表().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>();
objectlist(此列表)中的公共静态列表,其中T:class
{
var result=新列表();
ForEach(t=>result.Add(t作为t));
返回结果;
}
列表相册=搜索(0).FromObjectList();

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

你的搜索方法对你没有好处。你有所有的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;
    }
}
公共静态IList SearchAlbums(字符串SearchString)
{
使用(DBContext db=new DBContext())
{
var AlbumSearch=db.Albums.Where(x=>x.AlbumName.Contains(SearchString)||
x、 AlbbumSmallDesc.Contains(搜索字符串)| | x.AlbumNameEnglish.Contains(搜索字符串)||
x、 AlbbumSmallDescEnglish.Contains(SearchString)).ToList();
返回相册搜索;
}
}

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

您很可能混合了通用和非通用集合
AlbumsSearch=helper.Search(db.Albums,xyz).ToList()
我尝试了`AlbumsSearch=helper.Search(db.Albums,xyz).ToList()但是我在IntelliSense中找不到tolist的乐趣如果你想要一个方法来操作各种类型的集合,你应该使用泛型。这将不起作用,因为在视图模型中,
列表
将无法设置
列表