【问题标题】:How to return an anonymous type after joining two models加入两个模型后如何返回匿名类型
【发布时间】:2015-10-21 14:27:09
【问题描述】:

我正在开发一个 asp.net mvc-5 Web 应用程序。我有以下动作方法,它在控制器类中返回一个 ActionResult :-

public ActionResult AutoComplete(string term, string SearchBy)
{
    if (SearchBy == "Tag")
    {
        var tech = repository.AllFindTechnolog(term.Trim()).ToList();
        var resources = repository.GetResources(tech.Select(a => a.IT360ID.Value).ToArray(), false).ToList();
        var query = from techItems in tech
                    join resourcesItems in resources
                    on techItems.IT360ID.Value equals resourcesItems.RESOURCEID // join based on db2ID
                    orderby techItems.PartialTag
                    select new { extra = true, label = techItems.Tag.ToString(), techtype = techItems.TechnologyType.Name, status = resourcesItems.ResourceState.DISPLAYSTATE, customername = resourcesItems.ResourceLocation.SiteDefinition.AccountDefinition.ORG_NAME.ToString(), resourcename = resourcesItems.RESOURCENAME.ToString(), sitename = resourcesItems.ResourceLocation.SiteDefinition.SDOrganization.NAME };

        return Json(query, JsonRequestBehavior.AllowGet);
    }
    else
    {
        var activeResources = repository.FindActiveResourceByName(term.Trim(), true).ToList();//.OrderBy(p => p.RESOURCENAME).Select(a => new { label = a.RESOURCENAME }).ToList();
        var resources = repository.GetResources(activeResources.Select(a => a.RESOURCEID).ToArray(), false).ToList();
        var tech = repository.getTechnologiesByIT360ids(activeResources.Select(a=>a.RESOURCEID).ToArray()).ToList();
        var query = from techItems in tech
                    join resourcesItems in resources
                    on techItems.IT360ID.Value equals resourcesItems.RESOURCEID // join based on db2ID
                    orderby techItems.Tag
                    select new { extra = true, label = resourcesItems.RESOURCENAME.ToString(), techtype = techItems.TechnologyType.Name, status = resourcesItems.ResourceState.DISPLAYSTATE, customername = resourcesItems.ResourceLocation.SiteDefinition.AccountDefinition.ORG_NAME.ToString(), resourcename = techItems.Tag.ToString(), sitename = resourcesItems.ResourceLocation.SiteDefinition.SDOrganization.NAME };

        return Json(query, JsonRequestBehavior.AllowGet);

    }


}

现在我需要将此方法用于另一个控制器类。所以我尝试将此方法移至共享模型类,并从两个操作方法中引用此共享模型类。但我不确定我需要如何定义模型类方法定义。因为我不能/不应该从模型类中返回 ActionResult,所以任何人都可以对此提出建议吗?

【问题讨论】:

  • 为什么不创建一个返回具体类型而不是匿名对象的方法?
  • @YuvalItzchakov 你能在这方面提供更多建议吗?

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


【解决方案1】:

您可能可以清理这部分内容,但可以让您了解可以做什么。创建一个新类并将其命名为有意义的名称.. 我刚刚使用了 MyModel

public class MyModel
{
    public bool extra { get; set; }
    public string label { get; set; }
    public string techtype { get; set; }
    public string status { get; set; }
    public string customername { get; set; }
    public string resourcename { get; set; }
    public string sitename { get; set; }

    public static List<MyModel> AutoComplete(string term, string SearchBy)
    {
        using (var repository = new MyDataContext())
        {
            if (SearchBy == "Tag")
            {
                var tech = repository.AllFindTechnolog(term.Trim()).ToList();
                var resources = repository.GetResources(tech.Select(a => a.IT360ID.Value).ToArray(), false).ToList();
                var query = from techItems in tech
                            join resourcesItems in resources
                            on techItems.IT360ID.Value equals resourcesItems.RESOURCEID // join based on db2ID
                            orderby techItems.PartialTag
                            select new MyModel { extra = true, label = techItems.Tag.ToString(), techtype = techItems.TechnologyType.Name, status = resourcesItems.ResourceState.DISPLAYSTATE, customername = resourcesItems.ResourceLocation.SiteDefinition.AccountDefinition.ORG_NAME.ToString(), resourcename = resourcesItems.RESOURCENAME.ToString(), sitename = resourcesItems.ResourceLocation.SiteDefinition.SDOrganization.NAME };

                return query.ToList();
            }
            else
            {
                var activeResources = repository.FindActiveResourceByName(term.Trim(), true).ToList();//.OrderBy(p => p.RESOURCENAME).Select(a => new { label = a.RESOURCENAME }).ToList();
                var resources = repository.GetResources(activeResources.Select(a => a.RESOURCEID).ToArray(), false).ToList();
                var tech = repository.getTechnologiesByIT360ids(activeResources.Select(a => a.RESOURCEID).ToArray()).ToList();
                var query = from techItems in tech
                            join resourcesItems in resources
                            on techItems.IT360ID.Value equals resourcesItems.RESOURCEID // join based on db2ID
                            orderby techItems.Tag
                            select new MyModel { extra = true, label = resourcesItems.RESOURCENAME.ToString(), techtype = techItems.TechnologyType.Name, status = resourcesItems.ResourceState.DISPLAYSTATE, customername = resourcesItems.ResourceLocation.SiteDefinition.AccountDefinition.ORG_NAME.ToString(), resourcename = techItems.Tag.ToString(), sitename = resourcesItems.ResourceLocation.SiteDefinition.SDOrganization.NAME };

                return query.ToList();
            }
        }
    }
}

现在,当您想在操作结果中使用它时,您只需调用

public ActionResult AutoComplete(string term, string SearchBy)
{
    return Json(MyModel.AutoComplete(term, SearchBy),JsonRequestBehavior.AllowGet); 
}

【讨论】:

    【解决方案2】:

    构建一个类(视图模型)以供任何对构建 JSON 结果感兴趣的代码使用,如下所示:

    public class AutoCompleteViewModel
    {
        public bool extra { get; set; }
        public string label { get; set; }
        public string techtype { get; set; }
        public string status { get; set; }
        public string customername { get; set; }
        public string resourcename { get; set; }
        public string sitename { get; set; }
    }
    

    现在您可以将 AutoCompleteViewModel 用作构建/填充此对象的单独方法的返回类型,或者在您的操作方法的 LINQ 查询中使用,如下所示:

    public ActionResult AutoComplete(string term, string SearchBy)
    {
        if (SearchBy == "Tag")
        {
            var tech = repository.AllFindTechnolog(term.Trim()).ToList();
            var resources = repository.GetResources(tech.Select(a => a.IT360ID.Value).ToArray(), 
                                                    false).ToList();
            var query = from techItems in tech
                        join resourcesItems in resources
                        on techItems.IT360ID.Value equals resourcesItems.RESOURCEID
                        orderby techItems.PartialTag
                        select new AutoCompleteViewModel { extra = true, 
                                                           label = techItems.Tag.ToString(), 
                                                    techtype = techItems.TechnologyType.Name, 
                                          status = resourcesItems.ResourceState.DISPLAYSTATE, 
     customername = resourcesItems.ResourceLocation.SiteDefinition.AccountDefinition.ORG_NAME.ToString(), resourcename = resourcesItems.RESOURCENAME.ToString(), sitename = resourcesItems.ResourceLocation.SiteDefinition.SDOrganization.NAME };
    
        return Json(query, JsonRequestBehavior.AllowGet);
    }
    else
    {
        var activeResources = repository.FindActiveResourceByName(term.Trim(), true).ToList();//.OrderBy(p => p.RESOURCENAME).Select(a => new { label = a.RESOURCENAME }).ToList();
        var resources = repository.GetResources(activeResources.Select(a => a.RESOURCEID).ToArray(), false).ToList();
        var tech = repository.getTechnologiesByIT360ids(activeResources.Select(a=>a.RESOURCEID).ToArray()).ToList();
        var query = from techItems in tech
                    join resourcesItems in resources
                    on techItems.IT360ID.Value equals resourcesItems.RESOURCEID // join based on db2ID
                    orderby techItems.Tag
                    select new AutoCompleteViewModel { extra = true, label = resourcesItems.RESOURCENAME.ToString(), techtype = techItems.TechnologyType.Name, status = resourcesItems.ResourceState.DISPLAYSTATE, customername = resourcesItems.ResourceLocation.SiteDefinition.AccountDefinition.ORG_NAME.ToString(), resourcename = techItems.Tag.ToString(), sitename = resourcesItems.ResourceLocation.SiteDefinition.SDOrganization.NAME };
    
            return Json(query, JsonRequestBehavior.AllowGet);
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用dynamic 作为您的共享模型类返回类型。

      样本(未经测试!):

          public dynamic AutoCompleteService(string term, string SearchBy)
          {
              if (SearchBy == "Tag")
              {
                  var tech = repository.AllFindTechnolog(term.Trim()).ToList();
                  var resources = repository.GetResources(tech.Select(a => a.IT360ID.Value).ToArray(), false).ToList();
                  var query = from techItems in tech
                              join resourcesItems in resources
                              on techItems.IT360ID.Value equals resourcesItems.RESOURCEID // join based on db2ID
                              orderby techItems.PartialTag
                              select new { extra = true, label = techItems.Tag.ToString(), techtype = techItems.TechnologyType.Name, status = resourcesItems.ResourceState.DISPLAYSTATE, customername = resourcesItems.ResourceLocation.SiteDefinition.AccountDefinition.ORG_NAME.ToString(), resourcename = resourcesItems.RESOURCENAME.ToString(), sitename = resourcesItems.ResourceLocation.SiteDefinition.SDOrganization.NAME };
      
                  return query;
              }
              else
              {
                  var activeResources = repository.FindActiveResourceByName(term.Trim(), true).ToList();//.OrderBy(p => p.RESOURCENAME).Select(a => new { label = a.RESOURCENAME }).ToList();
                  var resources = repository.GetResources(activeResources.Select(a => a.RESOURCEID).ToArray(), false).ToList();
                  var tech = repository.getTechnologiesByIT360ids(activeResources.Select(a => a.RESOURCEID).ToArray()).ToList();
                  var query = from techItems in tech
                              join resourcesItems in resources
                              on techItems.IT360ID.Value equals resourcesItems.RESOURCEID // join based on db2ID
                              orderby techItems.Tag
                              select new { extra = true, label = resourcesItems.RESOURCENAME.ToString(), techtype = techItems.TechnologyType.Name, status = resourcesItems.ResourceState.DISPLAYSTATE, customername = resourcesItems.ResourceLocation.SiteDefinition.AccountDefinition.ORG_NAME.ToString(), resourcename = techItems.Tag.ToString(), sitename = resourcesItems.ResourceLocation.SiteDefinition.SDOrganization.NAME };
      
                  return query;
              }
          }
      

      并更改控制器的方法

          public ActionResult AutoComplete(string term, string SearchBy)
          {
              return Json(AutoCompleteService(term, SearchBy), JsonRequestBehavior.AllowGet);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多