【问题标题】:How to combine two model list to one model如何将两个模型列表合并为一个模型
【发布时间】:2012-11-07 15:39:35
【问题描述】:

请看下面的代码:

public class NewsFilterModel
{
    public CtArticleDetail ArticleDetail { get; set; }

    public PcPage Page { get; set; }
}

public IEnumerable<NewsFilterModel> GetNewsFilterModelByTagNames(string tagNames, int status)
{
     var resultArticle = db.CtArticleDetail.Where(m => m.tagNames == tagNames);
     var resultPage  = db.PcPage.Where(m => m.tagNames == tagNames);
}

谁能建议将两个模型组合为一个模型的最佳方法是 NewsFilterModel 吗?

我想要实现的是:

NewsFilterModelList

1.Article1
2.Page1
3.Article2
4.Page2
5.Article3
6.Page3

我已经像下面这样结束了:

foreach (var item in pageResult)
            {
                resultList.Add(new NewsFilterModel { ArticleDetail = null, Page = item, Date = item.UpdatedOn.ToDateTime() });
            }

            foreach (var item in tempArticleList)
            {
                resultList.Add(new NewsFilterModel { ArticleDetail = item, Page = null, Date = item.LiveDate.ToDateTime() });
            }

            return resultList.AsEnumerable();

谁有更好的主意,请指教。

【问题讨论】:

  • 你怎么知道哪个CtArticleDetail和哪个PcPage搭配?
  • PcPage 和 CtArticleDetail 之间没有关系。所以我想我不需要知道。
  • 那么,给定一个可枚举的CCArticleDetail 和PcPage,这些可枚举是否应该具有1:1 的比例并为每组制作一个模型?当集合中的项目数量不相等时会发生什么?我不确定你想在这里实现什么。
  • 我正在尝试生成一个包含 ctArticle 和 pcpage 的列表页面。

标签: c# asp.net-mvc-3 linq entity-framework lambda


【解决方案1】:

您可以使用 Union 来合并结果集

var query1 = db.CtArticleDetail
    .Where(a => a.tagNames.Equals(tagNames))
    .Select(a => new NewsFilterModel() { ArticleDetail = a, Page = null });
var query2 = db.PcPage
    .Where(a => a.tagNames.Equals(tagNames))
    .Select(a => new NewsFilterModel() { ArticleDetail = null, Page = a });
var query3 = query1.Union(query2)
    //.OrderBy(a => a.Date); -- Order here
    ;

【讨论】:

    【解决方案2】:

    显然你的CtArticleDetail 和PcPage 没有任何关系,所以你需要改变你的模型。

    public class NewsFilterModel
    {
        public IEnmerable<CtArticleDetail> ArticleDetails { get; set; }
    
        public IEnmerable<PcPage> Pages { get; set; }
    }
    

    和

    public NewsFilterModel GetNewsFilterModelByTagNames(string tagNames, int status)
    {
         var resultArticle = db.CtArticleDetail.Where(m => m.tagNames == tagNames);
         var resultPage  = db.PcPage.Where(m => m.tagNames == tagNames);
    
         var newsFilterModel = new NewFilterModel { ArticleDetails = resultArticle, Pages = resultPage };
         return newsFilterModel;
    }
    

    【讨论】:

    • 谢谢。太棒了。但我需要返回 IEnumerable 因为该模型列表页面有分页。并且列表需要根据 Live date 混合 articledetail 和 pcpage。
    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多