2014-01-25 13 views
0

我对查询的性质和工作感到困惑,我试图访问包含每个名称的数据库不止一次具有相同的EMPid,所以当我在我的DROP DOWN LIST中访问它时然后同样的重复也在那里,所以我试图通过把DISTINCT删除重复查询,但没有工作,但后来我修改它的另一种方式,那工作,但为什么工作,我不明白?在MVC和LINQ TO SQL中的SELECT查询的性质

QUERY没有工作

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

QUERY这工作,而我不知道怎么样?

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

为什么第二次工作酷似我想(每名1次采摘)

我使用MVC 3和LINQ to SQL和我是新手。

回答

1

这两个查询都不同。我正在向你解释两个SQL语句,这将有助于你理解这两个查询。

你的第一个查询是:

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

SQL: -

SELECT DISTINCT [T 0] [EMPLID],[T 0] [EmplName],[T 0]。[部门] FROM [EmployeeAtd] AS [T 0]

你的第二个查询:

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

SQL: -

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

现在您可以看到两个查询的SQL查询。第一个查询显示,你在表中的所有列执行不同的,但在第二个查询,你只需要在列。这样它给你想要的结果实施不同的。

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

woww先生,它的工作太多,但我的问题是,为什么它是工作,为什么不属于我吗?详细请先生 –

+0

是否有EmployeeAtd任何其他列?他们每行都不同? – ramiramilu

+0

@Evilrising,我的答案更新。 –

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