IQueryable 不包含 SingleOrDefault 的定义

Posted

技术标签:

【中文标题】IQueryable 不包含 SingleOrDefault 的定义【英文标题】:IQueryable does not contain a definition for SingleOrDefault 【发布时间】:2019-08-21 10:11:21 【问题描述】:

我使用实体框架在 C# 中创建了一个简单的登录表单。我在调用query.SingleOrDefault的if语句中不断收到此错误@

错误 CS1061“IQueryable”不包含“SingleOrDefault”的定义,并且找不到接受“IQueryable”类型的第一个参数的可访问扩展方法“SingleOrDefault”(您是否缺少 using 指令或程序集引用?)

我对此比较陌生,我该如何解决这个错误?

using DevExpress.XtraEditors;
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using System.Data.Entity;

namespace myHome

    public partial class frmLogin : DevExpress.XtraEditors.XtraForm
    
        public frmLogin()
        
            InitializeComponent();
        

        private void labelControl3_Click(object sender, EventArgs e)
        

        

        private void linkSite_Click(object sender, EventArgs e)
        
            System.Diagnostics.Process.Start("http://www.pishdad.org");
        

        private void btnInput_Click(object sender, EventArgs e)
        
            if (string.IsNullOrEmpty(txtUser.Text))
            
                XtraMessageBox.Show("نام کاربری وارد نشده است", "پیام", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtUser.Focus();
                return;
            
            else if (string.IsNullOrEmpty(txtPass.Text))
            
                XtraMessageBox.Show("رمز کاربری وارد نشده است", "پیام", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtPass.Focus();
                return;
            


            try

            
                IQueryable query = null;
                using (myHomeEntities db = new myHomeEntities())
                
                    query = from u in db.TB_User
                        where u.UserName == txtUser.Text && u.PassWord == txtPass.Text
                        select u;

                


                if (query.SingleOrDefault() != null) // This line is the issue.
                
                    XtraMessageBox.Show("شما دسترسی پیدا کردید! ", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
                
                else
                
                    XtraMessageBox.Show("ورود نا  معتبر! ", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
                
            
            catch (Exception ex)
            
                XtraMessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                throw;
            
        

        private void BtnExit_Click(object sender, EventArgs e)
        
            this.Close();
        
    

【问题讨论】:

首先将您的查询转换为列表:"query.ToList().SingleOrDefault()",然后重试。 您的问题是您已将query 明确声明为IQueryable 类型。改为将其声明为IQueryable<YourUserType> 看起来您将纯文本密码存储在数据库中。甚至不要考虑以纯文本形式存储密码。始终存储散列和加盐密码。如果你真的想要一个好的登录机制并且想要使用 Entity Framework,看看 Identity。 @AmirHN 我已经包含了对 Afshin 解决方案的解释以及替代方案。 【参考方案1】:

使用这个:

try

   IQueryable<TB_User> query = null;
   ...


  if (query.ToList().SingleOrDefault() != null)
  
     ...
  


【讨论】:

现在我收到此错误严重性代码描述项目文件行抑制状态错误 CS1061“IQueryable”不包含“ToList”的定义,并且没有可访问的扩展方法“ToList”接受第一个参数类型“可以找到 IQueryable'(您是否缺少 using 指令或程序集引用?) myHome J:\prC#\myHome\frmLogin.cs 56 Active ToList()IQueryable&lt;T&gt; 而不是 IQueryable 的扩展方法。 使用此更改:IQueryable 答案应该显示minimal代码来说明差异,并解释为什么对代码的更改可以解决问题。不只是在一行更改的情况下转储一大堆代码。【参考方案2】:

接受的答案没有很好地解释变化,所以我认为这篇文章值得。

Amir,您尝试将非泛型 IQueryable 作为参数传递给需要 IEnumerable&lt;T&gt;SingleOrDefault()

Afshin 通过将IQueryable 更改为IQueryable&lt;T&gt; 解决了您的错误,然后通过ToList() 将其转换为IEnumerable&lt;T&gt;

您也可以使用Queryable.Cast&lt;T&gt;() 来获得所需的结果:

query.Cast<T>().ToList().SingleOrDefault(); // T being your desired Type

【讨论】:

以上是关于IQueryable 不包含 SingleOrDefault 的定义的主要内容,如果未能解决你的问题,请参考以下文章

建立 IQueryable 包括基于条件的附加表

IQueryable 实体框架 POCO 映射

并且找不到可接受类型为“System.Linq.IQueryable<MvcApplication1.Models.Student>”

ThenInclude 在 EF Core 查询中无法识别

LinQ高级查询组合查询IQueryable集合类型

每 N 个日期的 IQueryable Lambda 表达式