IQueryable不包含SingleOrDefault的定义

时间:2019-08-21 10:11:21

标签: c# sql entity-framework linq

我使用Entity Framework在C#中创建了一个简单的登录表单。我在if语句中调用query.SingleOrDefault

的过程中不断收到此错误
  

错误CS1061'IQueryable'不包含'SingleOrDefault'的定义,并且找不到可以接受的扩展方法'SingleOrDefault'接受类型为'IQueryable'的第一个参数(您是否缺少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();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

使用此:

try
{
   IQueryable<TB_User> query = null;
   ...


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

}

答案 1 :(得分:0)

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

阿米尔,您尝试将非通用的IQueryable作为参数传递给SingleOrDefault(),而该参数需要IEnumerable<T>

Afshin通过将IQueryable更改为IQueryable<T>,然后通过ToList()将其转换为IEnumerable<T>,解决了您的错误。

您还可以使用Queryable.Cast<T>()来获得所需的结果:

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