MVC和LINQ TO SQL中SELECT查询的本质

时间:2014-01-25 06:24:35

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

我对查询的性质和工作感到有点困惑,我试图访问包含每个名称不止一次具有相同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();

为什么第二次工作完全像我想要的那样(每次挑选一个名字)

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

3 个答案:

答案 0 :(得分:1)

试试这个:

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();

答案 1 :(得分:1)

根据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。两个重写方法的实现使用类型上的所有公共属性来计算对象的哈希代码并测试相等性。如果同一匿名类型的两个对象的属性具有相同的值 - 则对象相等。这是一种安全策略,因为匿名类型对象本质上是不可变的(所有属性都是只读的)。

答案 2 :(得分:1)

两个查询都不同。我在SQL中解释您的查询,这将有助于您理解两个查询。

您的第一个疑问是:

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

SQL: -

  

SELECT DISTINCT [t0]。[EmplID],[t0]。[EmplName],[t0]。[Dept]   来自[EmployeeAtd] AS [t0]

您的第二个疑问是:

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

SQL: -

  

SELECT DISTINCT [t0]。[EmplID],[t0]。[EmplName] FROM [EmployeeAtd] AS   [T 0]

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