【问题标题】:nature of SELECT query in MVC and LINQ TO SQLMVC 和 LINQ TO SQL 中 SELECT 查询的性质
【发布时间】:2014-01-25 06:24:35
【问题描述】:

我对查询的性质和工作方式有点困惑,我尝试访问包含每个名称的数据库不止一次具有相同的 EMPid,所以当我在我的 DROP DOWN LIST 中访问它时,那里也有相同的重复,所以我尝试了通过将 DISTINCT 放入查询中来消除重复,但这没有用,但后来我用另一种方式修改它并且有效,但 为什么会这样,我不明白?

查询无效

 var names = (from n in DataContext.EmployeeAtds select n).Distinct();

我不知道如何工作的查询?

var names = (from n in DataContext.EmployeeAtds select new {n.EmplID, n.EmplName}).Distinct();

为什么 2nd 的工作方式和我想要的完全一样(每个名字都选了 1 次)

我正在使用 mvc 3 和 linq to sql,我是新手。

【问题讨论】:

    标签: asp.net sql asp.net-mvc linq-to-sql


    【解决方案1】:

    这两个查询是不同的。我正在用 SQL 向您解释这两个查询,这将帮助您理解这两个查询。

    您的第一个查询是:

       var names = (from n in DataContext.EmployeeAtds select n).Distinct();
    

    SQL:-

    SELECT DISTINCT [t0].[EmplID], [t0].[EmplName], [t0].[Dept] FROM [EmployeeAtd] AS [t0]

    您的第二个查询是:

     (from n in EmployeeAtds select new {n.EmplID, n.EmplName}).Distinct()
    

    SQL:-

    SELECT DISTINCT [t0].[EmplID], [t0].[EmplName] FROM [EmployeeAtd] AS [t0]

    现在您可以看到两个查询的 SQL 查询。第一个查询显示您正在对表的所有列实施 Distinct,但在第二个查询中,您仅在所需列上实施 distinct,因此它会为您提供所需的结果。

    【讨论】:

      【解决方案2】:

      根据Scott Allen's Explanation

      var names = (from n in DataContext.EmployeeAtds select n).Distinct();

      Distinct 的文档很清楚——该方法使用默认的相等比较器来测试相等性,默认比较器看到 4 个不同的对象引用。解决此问题的一种方法是使用接受自定义 IEqualityComparer 的重载版本的 Distinct。

      var names = (from n in DataContext.EmployeeAtds select new {n.EmplID, n.EmplName}).Distinct();
      

      原来 C# 编译器会覆盖匿名类型的 Equals 和 GetHashCode。这两个重写方法的实现使用类型上的所有公共属性来计算对象的哈希码并测试是否相等。如果相同匿名类型的两个对象的属性值都相同——对象是相等的。这是一种安全的策略,因为匿名类型的对象本质上是不可变的(所有属性都是只读的)。

      【讨论】:

        【解决方案3】:

        试试这个:

        var names = DataContext.EmployeeAtds.Select(x => x.EmplName).Distinct().ToList();
        

        更新:

        var names = DataContext.EmployeeAtds
                  .GroupBy(x => x.EmplID)
                  .Select(g => new { EmplID = g.Key, EmplName = g.FirstOrDefault().EmplName })
                  .ToList();
        

        【讨论】:

        • 哇,先生,它也有效,但我的问题是它为什么有效,为什么我的无效?请先生详细说明
        • EmployeeAtd 中还有其他列吗?每一行它们都不同吗?
        • 您可以添加其他列,例如我的第二个答案
        • 好吧,简而言之,如果我在整个查询中使用 distinct,那么它将搜索所有列和记录,如果在任何记录中发现一个不匹配项(比如不相同),那么它将返回重复项?对 ? @SamieyMehdi
        猜你喜欢
        • 2011-01-03
        • 2012-05-16
        • 2020-02-04
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多