【问题标题】:linq query returns too many resultslinq 查询返回太多结果
【发布时间】:2013-07-12 06:17:39
【问题描述】:

编辑:这个问题现在解决了

我目前正在尝试使用 LINQ 从各种表中简单地选择多个列,我对此很陌生。基本上,我使用内部连接组合来自多个表的结果,以便将一些信息提供给我的模型,然后我将其传递给视图。该查询只返回第一个结果(这是一个正确的结果)并且返回它的次数比它出现的次数多,而从不显示任何其他结果。也就是说,它会多次重复第一个结果,而不会显示任何其他结果。

所以如果输出应该是这样的(这只是一个例子)

Name     Task Name   Status
Derp    Do the Dishes   ACTIVE
John    Example Task    COMPLETE
Jesus   Walk on Water   IMPOSSIBLE

它会说

Name     Task Name   Status
Derp    Do the Dishes   ACTIVE
Derp    Do the Dishes   ACTIVE
Derp    Do the Dishes   ACTIVE
Derp    Do the Dishes   ACTIVE
Derp    Do the Dishes   ACTIVE
Derp    Do the Dishes   ACTIVE
Derp    Do the Dishes   ACTIVE
Derp    Do the Dishes   ACTIVE
Derp    Do the Dishes   ACTIVE

我认为我的 LINQ 语法有问题。

这是我的控制器的相关部分:

var TaskInstanceList = taskInstanceService.SelectAll();
        var Person = personService.SelectAll();
        var Task = taskService.SelectAll();
        var Status = statusService.SelectAll();

        var NewModel = new TaskLogModelContainer();
        NewModel.Tasks = new List<TaskLogModel>();

        var results = from ti in TaskInstanceList
                      join p in Person on ti.personID equals p.personID
                      join t in Task on ti.taskID equals t.taskID
                      join s in Status on ti.task_statusID equals s.statusID
                      select new { Person = p, Task = t, Status = s, Instance = ti };

        foreach (var result in results)
        {
            var obj = new TaskLogModel();
            obj.ID = result.Instance.person_taskID;
            obj.FirstName = result.Person.FirstName;
            obj.LastName = result.Person.LastName;
            obj.Description = result.Task.Description;
            obj.TaskName = result.Task.Name;
            obj.Value = result.Task.Value;
            obj.Status = result.Status.Status;
            obj.Notes = result.Status.Notes;

            NewModel.Tasks.Add(obj);
        }

        return View(NewModel);

这是我的看法

@model MyProj.Models.TaskLogModelContainer

@{
    ViewBag.Title = "index";
}

<h2>@ViewBag.Title</h2>

<table>
    <tr>
        <th>
            Name
        </th>
        <th>
            Task Name
        </th>
        <th>
            Status
        </th>
    </tr>

    @foreach (var item in Model.Tasks)
    {
    <tr>
        <td>@item.FirstName @item.LastName</td>
        <td>@item.TaskName</td>
        <td>@item.Status</td>
    </tr>
    }
</table>

【问题讨论】:

  • 我刚刚用假数据测试了你的代码,它工作正常。在这里:dl.dropboxusercontent.com/u/67454234/Program.cs
  • 我不确定问题是什么......您的查询是否返回了您期望多行的一行?
  • 我将编辑原帖以澄清问题

标签: c# .net linq


【解决方案1】:

请澄清,如果您的 Linq 语句返回的结果过多,或者输出中的数据量与查询不对应。

如果您的 Linq 语句返回的结果过多,您可能会将查询减少到单个联接。 所以开始吧:

  var results = from ti in TaskInstanceList
  join p in Person on ti.personID equals p.personID

然后

  var results = from ti in TaskInstanceList
  join t in Task on ti.taskID equals t.taskID

备注:此文应由注释——我的名誉不允许写一个

【讨论】:

  • 我只得到第一行的结果。实际的行数据是正确的。该行重复大约 7 或 8 次。
  • 很高兴听到问题已解决。只是一个考虑:而不是使用“select new { Person = p, Task = t, Status = s, Instance = ti };”您可以直接实例化您的 TaskLogModel 对象“select new TaskLogModel { FirstName = p.FirstName, ... }
【解决方案2】:

已解决。

我的一个 SelectAll 语句被窃听。这很奇怪,因为我已经对它们进行了彻底的测试,并且在一小时前使用它没有任何问题。也许我不小心按了 ctrl-z 键或撞了键。

【讨论】:

  • TaskInstanceList 有关系吗?我想,这可能是罪魁祸首。
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多