【问题标题】:ToList() method using Single() linq queryToList() 方法使用 Single() linq 查询
【发布时间】:2015-04-21 19:26:33
【问题描述】:

我的 ToList() 方法有问题,基本上我正在尝试创建一个将返回 var linq 查询的函数转换为列表,这里是函数。

 List<UsersTabPage> GetFirstOne()
 {
    using (MCMDataContext db = new MCMDataContext())
    {
        MCM.User user = new MCM.User();
        var firstone = (from oneUser in db.Users
                        where oneUser.ID == user.ID
                        select oneUser).Single();
        return firstone.ToList();
    }
 }

这是我目前在应用程序中使用的库。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Win32;
using MahApps.Metro.Controls.Dialogs;
using System.IO;
using System.Data;

如果需要任何库,请在下面评论或发布答案。 这是错误。

“MCM.User”不包含“ToList”的定义,并且找不到接受“MCM.User”类型的第一个参数的扩展方法“ToList”(您是否缺少 using 指令或程序集引用? ) 如果您知道任何答案,请在下面发布。谢谢。

【问题讨论】:

  • NET 框架版本?
  • 您使用的是 .Single(),然后是 .ToList()。因此,如果您想这样做,请将您的项目包装在一个列表中
  • 停止编辑问题的标题。删除问题的实际标题是非常有害的。
  • 我会因为这样我会得到 - 投票和代表消失。
  • 请把问题的原标题放在问题的后面,以帮助人们找到问题并用您收到的解决方案解决您遇到的问题。

标签: c# sql-server wpf linq linq-to-sql


【解决方案1】:

你打电话给Single(),这意味着你得到了一个结果。 ToList()IEnumerable&lt;T&gt; 的扩展方法。

如果你想创建一个只有一个元素的列表,你可以这样写:

return new List<UsersTabPage> { firstone };

...但似乎更有可能要么您应该摆脱Single()调用您应该让您的方法返回UsersTabPage

另一方面,firstone 的类型似乎是 User,而不是 UsersTabPage - 我们对这两种类型之间的关系一无所知,所以您可能想重新审视一下方面也是。

【讨论】:

  • 基本上我是 Linq to Sql 和 WPF 的新手,我想使用 linq to sql 从数据库中获取第一条记录,我尝试了这个查询,但感谢您的帮助以及如何获得那么我删除单后的数据呢?
  • @ShariqMusharaf:好吧,如果你只想要一条记录,你不应该删除 Single 调用 - 但鉴于你有一个 MCM.User 类型的对象,你打算如何把它变成List&lt;UsersTabPage&gt;?什么UsersTabPage?你确定你真的希望这个方法返回一个List&lt;UsersTabPage&gt;吗? (听起来不太可能……)
  • UsersTabPage 是 XAML 布局文件,我正在尝试从数据库中获取第一条记录,如果有更好的方法可以推荐我使用 linq 获取第一条记录吗?
  • @ShariqMusharaf:好吧,我只使用var record = db.Users.Single(u =&gt; u.ID == user.ID);... 奇怪的是,您从新创建的默认记录中获取 ID,请注意。如果您有一个方法访问数据库但尝试返回 UI 元素列表,听起来您正在混合 UI 和存储逻辑 - 我建议您退后一步,看看您的应用程序的架构。
【解决方案2】:

您在 LINQ 语句的末尾调用 .Single(),因此该语句返回 MCM.User 对象而不是 IEnumerable。删除.Single()

【讨论】:

    【解决方案3】:

    您正在返回UsersTabPage 类型的单个对象,因此您不能调用ToList(),因为ToList() 可以在集合上调用,它不能在不是集合的单个实例上调用。 您可以通过以下方式使用Take()

    var firstone = (from oneUser in db.Users
                      where oneUser.ID == user.ID
                      select oneUser).Take(1).ToList();
    return firstone;
    

    或者更简单的使用 lambda 语法:

    var firstone = db.Users.Where(oneUser => oneUser.ID == user.ID)
                           .Take(1).ToList();
    return firstone;
    

    【讨论】:

    • Take() 是做什么的?
    • 它只会给出第一个元素集合,但它也将是一个包含 1 个项目的集合。
    【解决方案4】:

    你得到了单个对象,你期望哪个列表!

    firstone. = ....Single();
    firstone.ToList();
    

    【讨论】:

      【解决方案5】:

      它不起作用...通过在 LINQ 查询上选择 .Single(),您只会得到一个结果,因此无法将一个元素转换为列表。

      如果要转换为列表,请删除.Single()

      当我向人们提到应该谨慎使用var 时,这正是我的意思:通过适当的显式类型定义,可以避免整个问题。

      List<UsersTabPage> GetFirstOne()
      {
          using (MCMDataContext db = new MCMDataContext())
          {
              MCM.User user = new MCM.User();
              var firstone = (from oneUser in db.Users
                        where oneUser.ID == user.ID
                        select oneUser);
              return firstone.ToList();
          }
      }
      

      List<UsersTabPage> GetFirstOne()
      {
          using (MCMDataContext db = new MCMDataContext())
          {
              MCM.User user = new MCM.User();
              return (from oneUser in db.Users
                        where oneUser.ID == user.ID
                        select oneUser).ToList();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多