c# - Linq SQL 在服务器端或应用程序端不同吗?

标签 c# sql linq

我需要一个在 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服务器获取distincted col1, 而在我的应用端无事可做?

非常感谢!

最佳答案

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

它的工作方式是使用 deferred execution .也就是说,只有在需要时,查询才会真正针对数据库运行。在此之前,它构建了所谓的 expression tree。然后根据数据源对其进行评估。所以你可以追加越来越多IQueryable<T>该语句的扩展方法,它们都应该转化为对数据库的单个查询。

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

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

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

关于c# - Linq SQL 在服务器端或应用程序端不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18907157/

相关文章:

c# - 在 try catch 都失败的情况下执行一个方法

c# - 防止在数据网格上添加空白行

c# - JavaScript 生成的网页问题

c# - 下拉列表中的国家/地区和城市列表

java - 从数据库中检索数据,将数据用作 java 方法的参数

c# - 如何使用 Linq 在 C# 列表中添加缺失值列表

c# - 请将 SQL 转换为 LINQ 或改进我的查询

c# - C# 8 新 switch 可以替换包含多个的代码块吗? : ? : expressions?

c# - Entity Framework Code First - 获取具有特定标签的博客文章

sql - 有没有办法可以在事务期间关闭 DELETE CASCADE 然后再次打开?