【问题标题】:DbSet not seeing LINQ definitionsDbSet 看不到 LINQ 定义
【发布时间】:2017-03-02 22:43:06
【问题描述】:

首先要弄清楚显而易见的事情,我

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

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

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

错误 CS1929“DbSet”不包含“ToList”的定义,并且最佳扩展方法重载“Enumerable.ToList(IEnumerable)”需要“IEnumerable”类型的接收器

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

这是一台新的笔记本电脑和全新的 Visual Studio 安装...这里有什么明显的遗漏吗?

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

大多数人在缺少 Linq 的 using 子句时会报告这一点,但我有,并且 intellisense 看到了它,这就是我感到困惑的地方。

有问题的行:

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

【问题讨论】:

  • “ExcludedUrls”是字符串而不是实体吗?您可以编辑您的问题以包含您的 DbContext 设置吗?
  • 请注意,var 不是数据类型,它是根据值/引用分配自动推断数据类型的关键字。检查System.Data.EntitySystem.Linq 的参考,确保它们已正确注册。你试过db.ExcludedUrls.AsEnumerable().ToList&lt;string&gt;();吗?
  • 我明确知道var 并且我有一个对System.Data.Linq 的项目引用(没有System.Linq)。 Intellisense 仅以通用形式看到 AsEnumerable,并希望 ExcludedUrls 作为类型。
  • 通常当您调用 ToLIst 时,您不会指定泛型类型,而是让 C# 编译器为您推断它。在您的代码中不这样做的任何原因(显然db.ExcludedUrls 不能是DbSet&lt;string&gt;,所以简单的ToList() 应该可以工作)?
  • @IvanStoev 确实如此。提交作为回复,我会接受。由于扩展方法,我在 Visual Studio 中没有看到任何重载......它向我展示的只是通用选项。删除泛型类型并用直接 ToList() 替换即可解决此问题。

标签: c# entity-framework linq


【解决方案1】:

我假设在您的代码中 db 是一个 Dbcontext,其属性为 ExcludedUrls,类型为 DbSet&lt;TEntity&gt;

DbSet&lt;TEntity&gt;实现IEnumerable&lt;TEntity&gt;如果你已经包含LINQ,你可以使用扩展方法Enumerable.ToList&lt;TEntity&gt;()

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

var excludedUrls = db.ExcludedUrls.ToList();

但是,这可能不会提供包含您想要的元素的列表。您必须以某种方式将源序列中的每个 excludeUrl 转换为您想要的字符串表示形式。如果 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();

换句话说:从excludedUrls序列中,取出每个元素,并使用Transform将其转换为字符串。将生成的字符串序列转换为一个列表,这将是一个字符串列表

顺便说一句,你有没有注意到我使用了ToList 而没有提到&lt;string&gt;?编译器能够检测输入序列中元素的类型,并可以创建相同类型元素的列表。

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

  • 少打字
  • 更容易更改源序列或中间 linq 语句
  • 更容易检测结果类型(因此更容易检测到您提到的错误)
  • 它允许使用匿名类型

【讨论】:

    【解决方案2】:

    事实证明,答案不是在这里调用ToList&lt;&gt; 的泛型形式,而是直接调用ToList(),它返回一个泛型List&lt;ExcludedUrl&gt;。感谢 cmets 部分的 Ivan Stoev 提供的提示。

    我在这里过于依赖 Intellisense 提示,而对内存的依赖不足。

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

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多