【问题标题】:IEnumerable<Movies> does not contain definition for FirstOrDefaultAsync()IEnumerable<Movies> 不包含 FirstOrDefaultAsync() 的定义
【发布时间】:2019-09-09 08:27:11
【问题描述】:

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

我已执行以下操作,但错误仍然存​​在:

  1. 我没有忘记使用 await,根据这个链接:Task does not contain a definition for 'FirstOrDefault'

  2. 我引用了 Sytem.Core 并导入了 System.Linq 和 System.Data.Entity。(System.Linq 不明确/灰色,因此未使用),根据此链接:DbSet doesn't contain definition for FirstOrDefault?

这是我的 .cshtml.cs 代码,其中正在生成错误(第 34 行):

using System.Collections.Generic;
using System.Linq;
using System.Data.Entity;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using Movies.Models;

namespace Movies.Pages.MediaDetails
{
    public class DetailsModel : PageModel
    {
        private readonly Movies.Models.MoviesContext _context;

        public DetailsModel(Movies.Models.MoviesContext context)
        {
            _context = context;
        }

        MovieDataAccessLayer objmovie = new MovieDataAccessLayer();

        public Movies Movies { get; set; }

        public async Task<IActionResult> OnGetAsync(byte? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            Movies = await objmovie.MovieByMedia(id).FirstOrDefaultAsync(m => m.MediaTypeID == id);

            if (Movies == null)
            {
                return NotFound();
            }
            return Page();
        }
    }
}

这是我的 DataAccessLayer,它被上面的代码引用并返回 IEnumerable。

using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.Entity;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Movies.Models
{
    public class MovieDataAccessLayer
    {
        string connectionString = "Server=servername;Database=DatabaseMovies;Trusted_Connection=True;MultipleActiveResultSets=true";

        public IEnumerable<Movies> MovieByMedia(byte? MediaID)
        {
            List<Movies> lstmovie = new List<Movies>();

            using (SqlConnection con = new SqlConnection(connectionString))
            {
                SqlCommand cmd = new SqlCommand("usp_MovieByMedia", con);
                cmd.Parameters.Add(new SqlParameter("@MediaID", SqlDbType.TinyInt) { Value = MediaID });
                cmd.CommandType = CommandType.StoredProcedure;

                con.Open();
                SqlDataReader rdr = cmd.ExecuteReader();

                while (rdr.Read())
                {
                    Movies movies = new Movies();

                    movies.MovieTitle = rdr["MovieTitle"].ToString();
                    movies.MovieYear = Convert.ToInt32(rdr["MovieYear"]);

                    lstmovie.Add(movies);
                }

                con.Close();

            }
            return lstmovie;
        }

    }
}

我们将不胜感激。

【问题讨论】:

    标签: asp.net tsql async-await ienumerable razor-pages


    【解决方案1】:

    .FirstOrDefaultAsync() 方法是 IQueryable 接口上的扩展方法。由于您的数据访问方法返回一个 IEnumerable 并且不是异步的,因此您应该使用 .FirstOrDefault()

    https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.queryableextensions.firstordefaultasync?view=entity-framework-6.2.0

    https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.firstordefault?view=netframework-4.8

    【讨论】:

    • 感谢您的回答和解释。这消除了错误,尽管我的代码仍然无法正常工作。
    【解决方案2】:

    尝试将您的 IEnumerable 转换为某种实际的集合,例如:

    objmovie.MovieByMedia(id).ToList().FirstOrDefault()
    

    【讨论】:

    • 当我这样做时,它说 List 不包含 FirstOrDefaultAsync() 的定义
    • 我没有意识到函数末尾没有Async。这确实消除了错误,但我的代码仍然需要一些工作。谢谢!
    猜你喜欢
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多