13

明確なものを使用して、リストから繰り返される行を削除したいと思います。

これが結果セットです(ご覧のとおり、インデックス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();

しかし、DISTINCTがまったくない場合と同じ7行が表示されます。

なんで?

4

6 に答える 6

6

SQLでDistinctを実行する場合は、ToList()の前にDistinct()を呼び出します。

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
    { ...  }).Distinct().ToList();
于 2012-12-19T13:38:22.493 に答える
5
var docIndexModel = docIndexModelDup
    .GroupBy(x => x.Id)
    .Select(g => g.First());
于 2012-12-19T13:41:30.990 に答える
1

試す:

var distinctRowsById = docObj.Select(i => i.Id)
    .Distinct()
    .Select(i => docObj.First(o => o.Id == i)
于 2012-12-19T13:36:02.897 に答える
0

SQL を使用するときは常に、.ToList() の前に .Distinct() を使用します。これでおそらく問題は解決します。例えば:

var ans = (from x in xyx
             where ...
             select new ...
             {
                a = ...,
                b = ...
             }).Distinct().ToList();
于 2012-12-19T18:11:05.063 に答える
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 の呼び出しを続行すると、正しく機能します。

于 2012-12-19T13:46:28.303 に答える