区别于不使用LINQ

时间:2012-12-19 13:33:13

标签: c# linq

我想使用distinct来删除LIST中重复的行。

这是结果集(如您所见,重复索引12和14)

id  idIndice    idName         idTipo   tamanho     caminho
12  11          Processo       3        10          C:\Program Files\Empenho\Senha.txt
13  13          Endereço       1        250         C:\Program Files\Empenho\Senha.txt
14  12          Número         2        5           C:\Program Files\Empenho\Senha.txt
15  9           Cep            5        8           C:\Program Files\Empenho\Senha.txt 
16  10          Dt. de Nasc.   4        0           C:\Program Files\Empenho\Senha.txt
12  11          Processo       3        10          C:\Program Files\Empenho\Senha.txt
14  12          Número         2        5           C:\Program Files\Empenho\Senha.txt

这是我想要的 sql (这样做)

select DISTINCT u.id, u.idIndice, t.idName, t.idTipo, t.tamanho, l.caminho
from  tgpwebged.dbo.sistema_Indexacao as u
join  tgpwebged.dbo.sistema_Indexes as t on u.idIndice = t.id
join  tgpwebged.dbo.sistema_Documentos as l on u.idDocumento = l.id
join  tgpwebged.dbo.sistema_DocType_Index as v on t.id = v.indexId
where u.idDocumento = 10 

这是 LINQ 我正在尝试改编

var docObj = from u in context.sistema_Indexacao
join t in context.sistema_Indexes on u.idIndice equals t.id
join l in context.sistema_Documentos on u.idDocumento equals l.id
join v in context.sistema_DocType_Index on t.id equals v.indexId
join m in context.sistema_DocType on v.docTypeId equals m.id
where u.idDocumento == id
select new Gedi.Models.OperacoesModel.getDocIndex
{ ...  };

这就是我的尝试:

List<Gedi.Models.OperacoesModel.getDocIndex> docIndexModelDup = docObj.ToList();
List<Gedi.Models.OperacoesModel.getDocIndex> docIndexModel =
docIndexModelDup.Distinct().ToList();

但我仍然得到相同的7行,好像根本没有DISTINCT。

为什么?

5 个答案:

答案 0 :(得分:5)

var docIndexModel = docIndexModelDup
    .GroupBy(x => x.Id)
    .Select(g => g.First());

答案 1 :(得分:1)

尝试:

var distinctRowsById = docObj.Select(i => i.Id)
    .Distinct()
    .Select(i => docObj.First(o => o.Id == i)

答案 2 :(得分:0)

在getDocIndex对象上,您需要实现该接口 IEquatable.这将告诉Distinct方法在进行比较时对象是否彼此相等。这是与Distinct进行比较的正确方法,它更清晰。

public class getDocIndex: IEquatable<getDocIndex> 
{
    ....
    public bool Equals(getDocIndex otherModel)
    {
        if (otherModel == null) 
            return false;
        return this.idName == otherModel.idName && this.idTipo == otherModel.idTipo
        && this.tamanho == otherModel.tamanho && this.caminho == otherModel.caminho;
    } 
}

实现此界面后,您可以继续调用distinct,它将正常工作。

答案 3 :(得分:0)

每当使用sql时,请在.ToList()之前使用.Distinct()。 这可能会解决问题。 例如:

var ans = (from x in xyx
             where ...
             select new ...
             {
                a = ...,
                b = ...
             }).Distinct().ToList();

答案 4 :(得分:0)

Distinct只能使用Lambda ..就像这个

var data =_CustomerCompanyRepository.GetAll().Where(p => (p.PrimaryUser == userid || p.SecondayUser == userid)).Distinct();

如果我们想删除linq查询中的重复项。使用组

 var Account = (from c in depa join u in UserManager.Users on c.Id equals u.DepartmentId
                               group c by c into g
                               select new datadto{ Id = g.Key.Id, Name = g.Key.DepatmentName }).ToArray();