linq的新手。编译器不喜欢我的查询。提供的代码

时间:2014-05-28 12:31:12

标签: linq

我正在处理一个函数,该函数根据传入的电影名称返回一个电影对象。

我是linq2entities的新手,我不知道如何解决我得到的编译器错误。

  public Film GetFilm(string FilmName)
    {
        Film temp = FilmEntity.Films.Where(f => f.FilmTitle == FilmName);
        return temp;
    }
  • 错误1无法将类型'System.Linq.IQueryable'隐式转换为'FilmWebApplication.Models.Film'。存在显式转换(您是否缺少演员表?)C:\ Users \ newWorkPC \ Documents \ Visual Studio 2010 \ Projects \ FilmWebApplication \ FilmWebApplication \ Content \ DataHandling.cs 26 25 FilmWebApplication

在这段代码中感觉f没有被定义,但我不知道是否是这种情况。

2 个答案:

答案 0 :(得分:3)

问题在于哪里不返回Film而是返回IQueryable<Film>

你应该做的就是这个

public Film GetFilm(string FilmName)
{
    Film temp = FilmEntity.Films.Where(f => f.FilmTitle == FilmName).Single();
    return temp;
}

或者

public Film GetFilm(string FilmName)
{
    Film temp = FilmEntity.Films.Single(f => f.FilmTitle == FilmName);
    return temp;
}

这一切都假设你在db中只有一个这个名字。如果可能有更多,你可以使用First或FirstOrDefault(如果它没有找到任何东西,这个将不会返回异常)。 Single也是如此。如果可能有ONE或NONE

,您也可以使用SingleOrDefault

答案 1 :(得分:0)

在哪里返回一个可以用于电影的IQueryable,但是你将它分配给一个电影。

如果您只期望一个结果,那么有比您可以使用的方法更好的方法。我常用的是

  • 首先(收集第一个集合,如果没有,则抛出)
  • FirstOrDefault(取第一个,如果没有则返回null)
  • 单身(如果只有一个则返回一个,否则会抛出)
  • SingleOrDefault(如果有多个返回null)。

假设FilmTitle是唯一的,你可以安全地使用Single(),如果不是那么你需要考虑如果有多个具有相同标题会发生什么。

public Film GetFilm(string FilmName)
{
    Film temp = FilmEntity.Films.Single(f => f.FilmTitle == FilmName);
    return temp;
}

另一种选择(如果你期待多部电影)可能是

public IEnumerable<Film> FindFilms(string searchString)
{
    return FilmEntity.Films.Where(f => f.FilmTitle.Contains(searchString));
}