3

我需要一个在 C# 应用程序中具有不同操作的 Linq

SQL应该是:

 select distinct(col1) from tableName;

我读了一些例如,知道我可以像这样写 Linq:

var myRes =
    (
         from a in tableName
         select a.col1
    ).Distinct();

所以这是我的问题:

这个 linq 是否:

从 MSSQL 服务器获取 一整套col1 到 myRes,然后使用 C# distinct() 函数在我的应用程序端进行区分?

如果是这样,我可以在服务器端区分它吗?

或者它确实:

只从 MSSQL 服务器获得不同的col1,而在我的应用程序端无事可做?

非常感谢!

4

1 回答 1

4

这应该DISTINCT在数据库端执行过滤器,除非在应用过滤器之前有其他东西使查询执行。您可以通过在执行查询时运行 SQL Server Profiler 来确认这一点。

其工作方式是使用延迟执行。也就是说,在需要之前,查询实际上不会针对数据库运行。在此之前,它会构建所谓的表达式树,然后根据数据源对其进行评估。因此,您可以在该语句上附加越来越多的IQueryable<T>扩展方法,它们都应该转换为针对数据库的单个查询。

在这种情况下,您传递的 ( myRes) 并不是真正的结果集,它是对将创建结果集的查询的引用。当枚举被评估为实际结果集时,查询将被构建和评估。比如你打电话的时候:

  • .ToList()
  • .Single()
  • .SingleOrDefault()
  • .First()
  • .FirstOrDefault()
  • 等等

基本上任何引用查询并将其转换为实际值或值集合的东西。

于 2013-09-20T00:42:06.283 回答