DbSet没有看到LINQ定义

时间:2017-03-02 04:40:34

标签: c# entity-framework linq

要清除明显的第一个,我 am

  • 使用System.Linq;
  • 使用System.Collections.Generic;
  • 有一个项目引用System.Core
  • 我的DbSet和DbContext类已正确定义

奇怪的是, intellisense 看到了它,但我有一个编译器警告,它不会编译。

我已经尝试过首先清理项目,重新启动Visual Studio等,它仍在抱怨:

  

错误CS1929' DbSet'不包含' ToList'的定义和最好的扩展方法重载' Enumerable.ToList(IEnumerable)'需要一个类型为的接收器

我的接收器"在这种情况下,编译器是静态确定的var

这是一台新的笔记本电脑和一个全新的Visual Studio安装......我在这里找不到一些明显的东西吗?

我想要这些internal但尝试切换所有内容pubilc只是为了确定,但我收到同样的错误。

大多数人在他们缺少Linq的using子句时会报告这个,但是我有,而 intellisense看到它这是我感到困惑的地方。

有问题的一行:

var excludedUrls = db.ExcludedUrls.ToList<string>();

2 个答案:

答案 0 :(得分:0)

我假设您的代码中的数据库是Dbcontext,其属性ExcludedUrls的类型为DbSet<TEntity>

DbSet<TEntity>实施IEnumerable<TEntity>如果您已添加LINQ,则可以使用扩展方法Enumerable.ToList<TEntity>()

由于您的错误,我认为TEntity不是字符串。如果省略该部分,您的代码将被编译:

var excludedUrls = db.ExcludedUrls.ToList();

但是,这可能不会给出包含所需元素的列表。不知何故,您必须将源序列中的每个excludedUrl转换为您想要的字符串表示形式。如果ToString()不这样做,你必须自己创建一个函数:

class MyDbContext : DbContext
{
    public DbSet<MyTSource> ExcludedUrls {get; set;}
}

void string Transform(MyTSource excludedUrl)
{
    ...
}

List<string> result = dbContext.ExcludedUrls
    .Select(excludedUrl => Transform(excludedUrl)
    .ToList();

在words:中,从excludedUrls序列中取出每个元素,并使用Transform将其转换为字符串。将生成的字符串序列转换为列表,该列表将是字符串列表

顺便提一下,您是否注意到我使用了ToList而未提及<string>?编译器能够检测输入序列中元素的类型,并可以创建相同类型元素的List。

在使用Linq函数时,请考虑避免提及TSource。这有几个好处:

  • 少输入
  • 更容易更改源序列或中间linq语句
  • 更容易检测到结果类型(从而更容易检测到您提到的错误)
  • 允许使用匿名类型

答案 1 :(得分:0)

事实证明,答案并未在此处调用ToList<>的通用格式,而是直接调用ToList(),后者返回通用List<ExcludedUrl>。感谢Ivan Stoev在评论部分提供的建议。

我在这里过分依赖Intellisense的提示而在内存方面还不够。

正如您所看到的,由于扩展方法的工作方式,它以通用形式向我提供了ToList,这就是为什么我的代码按原样编写。

ToList generic