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 ActiveToList()
是 IQueryable<T>
而不是 IQueryable
的扩展方法。
使用此更改:IQueryable接受的答案没有很好地解释变化,所以我认为这篇文章值得。
Amir,您尝试将非泛型 IQueryable
作为参数传递给需要 IEnumerable<T>
的 SingleOrDefault()
。
Afshin 通过将IQueryable
更改为IQueryable<T>
解决了您的错误,然后通过ToList()
将其转换为IEnumerable<T>
。
您也可以使用Queryable.Cast<T>()
来获得所需的结果:
query.Cast<T>().ToList().SingleOrDefault(); // T being your desired Type
【讨论】:
以上是关于IQueryable 不包含 SingleOrDefault 的定义的主要内容,如果未能解决你的问题,请参考以下文章
并且找不到可接受类型为“System.Linq.IQueryable<MvcApplication1.Models.Student>”