【问题标题】:C# actionresult filter using array or list使用数组或列表的 C# actionresult 过滤器
【发布时间】:2017-09-17 10:29:33
【问题描述】:

我觉得我要么很近,要么很远。虽然 MVC5 C# webapp 跌跌撞撞,但已经阅读了一些很好的帮助,但是我似乎无法找到让我得到结果的确切语法。

在我的控制器中,我试图根据字符串的串联过滤我的结果(所以基本上我可以将其转换为数组或列表 - 或者保持原样。不确定)。数组/列表可以是 1 到 14 个变量。控制器如下:

public ActionResult Result(string Person)
{
   Hierarchy h = db.Hierarchies.First(i => i.People == Person);
   if (h == null)
   {
        return HttpNotFound();
   }
   List<string> list = h.Hierarchy1.Split('/').ToList();

   //Trial 1
   var dat = from p in list where db.Hierarchies.Contains(p.list) select p; //

   //Trial 2
   var dat = db.Hierarchies.Where(s => s.People.Contains(list));//

   return View("Result", dat);
}

基本上,首先在表层次结构中查找人,然后我得到一个用“/”分隔的父级列表(层次结构1)。从这个列表中,我试图过滤掉不在层次结构表列表中的每一行。该表每行包含更多信息(出生日期、年龄、眼睛颜色等)。所有名称都是唯一的,因此不会出现错误。

我已经成功地像每个蓝眼睛的人一样进行更轻松的搜索,但是当有多个搜索时,我似乎无法将其加起来。

我已经尝试将它作为一个数组,但我最近的阅读似乎说一个列表更好地存储我的 string.split。

Hierarchy1 字符串可能如下所示:

克里斯·约翰·威尔克斯/大卫·约翰·威尔克斯/克雷格·拉姆齐·威尔克斯/迈克尔·威尔克斯

层次表示例:

  • 标题 - 层次结构 1;人;出生日期;年龄;眼睛;头发;

  • 数据 - 上面的每个层次结构1;Michael Wilks;05/02/1980;37;蓝色;棕色

基本上我正在尝试获取一个列表,我可以根据上面的数据在下面的视图(foreach)上循环遍历:

  • 克里斯·约翰·威尔克斯出生日期;年龄;眼睛;头发; (曾祖父)
  • David John Wilks DOB;年龄;眼睛;头发; (祖父)
  • Craig Ramsey Wilks DOB;年龄;眼睛;头发; (父亲)
  • Michael Wilks DOB;年龄;眼睛;头发; (儿子)

在此处列出的试用 1 错误 ---> 包含(p.list

在此处列出的试用 2 错误 ---> 包含(list

所以我可能对什么是正确的格式有点不知所措,但我一直在搜索互联网,所以,这是我能拼凑起来的最好的一些。

感谢每个人和任何人的帮助和帮助。

更新 2017 年 9 月 18 日 我已经放弃了我的第一次尝试,我认为我找到了一个更好的关键字来搜索 = "LINQ" 这让我得到了一些更好的结果,我认为这些结果正确地指向了我的答案。

        List<string> list = new List<string>();
        list = h.Hierarchy1.Split('/').ToList();

        foreach (string k in list)
        {
            IQueryable<Hierarchy> TQuery = from a in db.Hierarchies
                                           where (a.People == k)
                                           select a;
        }
        return View("Result", TQuery.ToList());

所以现在看起来我的查询有效,但我的“返回视图”在“TQuery”.ToList 上显示错误。 我的假设是因为我在 foreach 循环中而不是在外部调用它,所以我需要弄清楚如何在不引发错误的情况下将其取出。然后发布我将运行以查看它是否真的有效。

我仍然认为有一种方法可以在没有 foreach 循环的情况下做到这一点,但它让我无法理解

更新 19/09/2017 - 工作结果 所以我设法让它作为一个 IQueryable 工作并且没有一个 foreach - 我认为这意味着它是一个相当优化的解决方案 - 列表中的 People 在这一点上是无序的,但我认为这是次要的。

所以它是:

    public ActionResult Result(string Person)
    {
        Hierarchy h = db.Hierarchies.First(i => i.People == Person);
        if (h == null)
        {
            return HttpNotFound();
        }
        int lvl = h.Level;
        var list = new string[lvl];
        list = h.Hierarchy1.Split('/');

        IQueryable<Hierarchy> TQuery = from a in db.Hierarchies
                                       where list.Contains(a.People)
                                       select a;
        return View("Result", TQuery.ToList());
    }

【问题讨论】:

  • 包含方法需要一个字符串作为参数,为什么要传递列表(字符串列表)?您是否尝试过对列表进行 ForEach 循环?
  • @AryanFirouzyan - 是的,我从 foreach 循环开始,并没有取得太大的成功。我认为在搜索时我使用了错误的关键词。我似乎对“LINQ”有更多的运气,我认为这很重要。我将用我发现的内容更新我的帖子 - 仍然无法正常工作,但我认为我已经接近了
  • foreach 循环有问题。 TQuery 仅返回在列表的最后一项中找到的内容。在循环之前使用 null 启动 TQuery 并将结果添加到其中。为每个 k 添加 db.Hierarchies.Where(p=>p.Poeple == k) 到 TQuery。
  • @AryanFirouzyan - 感谢您与我一起解决一些问题。我认为就我最初的 SO 问题而言,这几乎是固定的。欣赏头脑风暴。
  • @AryanFirouzyan - 刚刚尝试了您的解决方案(我遗漏了一些东西)。它只显示列表中的最后一个人。所以很明显,当我通过循环时,它没有正确保存。您的解决方案看起来更好,因为它会订购我认为的列表。但我会继续我目前所做的工作,并在以后找出更精细的细节。谢谢

标签: c# arrays asp.net-mvc list controller


【解决方案1】:
    public ActionResult Result(string Person)
{
    Hierarchy h = db.Hierarchies.First(i => i.People == Person);
    if (h == null)
    {
        return HttpNotFound();
    }
    int lvl = h.Level;
    var list = new string[lvl];
    list = h.Hierarchy1.Split('/');

    IQueryable<Hierarchy> TQuery = from a in db.Hierarchies
                                   where list.Contains(a.People)
                                   select a;
    return View("Result", TQuery.ToList());
}

我可能应该补充一下 - 幸运的是,我确实将每个 Hierarchy1 的人数存储为表格中的“级别”,这样我就得到了一个数组大小“lvl”。

我仍然认为@AryanFirouzyan 指出了一个更好的解决方案,但由于我已经为此花费了 10 个小时,我认为我需要解决下一个问题 :)

【讨论】:

  • 添加到这个答案 - 我发现了如何订购这个。最后再次证明是相当明显的,因为我有每个级别的值。在“select a”之前,插入“orderby a.Level”,它按照从小到大的顺序排列出来。因此,我想关键是将位置存储在该人所属的“层次结构”中,相对于记录的第一个亲属。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多