C# 从viewmodel mvc 4中删除linq中的重复行

C# 从viewmodel mvc 4中删除linq中的重复行,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,如何从ViewModel中删除重复行 视图模型: public class ClientesPorEvento { public eventocliente eventocliente { get; set; } public cliente cliente { get; set; } public string NombreSubrecurso { get; set; } public string NombreRecurso { get; set; }

如何从ViewModel中删除重复行

视图模型:

public class ClientesPorEvento 
{
    public eventocliente eventocliente { get; set; }
    public cliente cliente { get; set; }
    public string NombreSubrecurso { get; set; }
    public string NombreRecurso { get; set; }
    public IEnumerable<precioventa> preciosventa { get; set; }
}
公共类客户端
{
公共事件客户端事件客户端{get;set;}
公共客户端客户端{get;set;}
公共字符串nombresurso{get;set;}
公共字符串NombreRecurso{get;set;}
公共IEnumerable preciosventa{get;set;}
}
控制器左连接查询代码:

public ActionResult ClientesPorEvento(int idEvento)
{
//se hace un left join para que se autollenen las filas null donde las columnas tienen datos
    IEnumerable<ClientesPorEvento> clientesPorEvento =
       (from c in db.cliente
        join ec in db.eventocliente on c.idCliente equals ec.idCliente
        join pv in db.precioventa on ec.idVenta equals pv.idVenta into pventa
            from pv in pventa.DefaultIfEmpty()
        join rc in db.recursocliente on ec.idVenta equals rc.idVenta into recuc
            from rc in recuc.DefaultIfEmpty()
            join sr in db.subrecurso on rc.idSubrecurso equals sr.idSubrecurso into subre
                from sr in subre.DefaultIfEmpty()
                join r in db.recurso on sr.idRecurso equals r.idRecurso into recur
                    from r in recur.DefaultIfEmpty()
        where ec.idEvento == idEvento
        select new ClientesPorEvento {
            preciosventa = pventa,
            eventocliente = ec,
            cliente = c,
            NombreSubrecurso = sr.nombre == null ? "" : sr.nombre,
            NombreRecurso = r.nombreRecurso == null ? "(No Reservas)" : r.nombreRecurso
        }).OrderBy(m => m.eventocliente.nroReserva);

    return PartialView(clientesPorEvento);
}
public ActionResult客户机(intidevento)
{
//这是一个非左路连接段,该段为自动连接段,该段为空连接段,该段为列连接段
IEnumerable客户群=
(来自客户数据库中的c)
在c.idCliente上的db.eventoclient中加入ec等于ec.idCliente
将pv加入ec上的db.precioventa中。idVenta等于pv.idVenta加入pventa中
来自pventa.DefaultIfEmpty()中的pv
将ec.idVenta上的db.RECURSOCLIENT中的rc连接到RECURC中等于rc.idVenta
从recuc.DefaultIfEmpty()中的rc
将rc.idSubrecurso上的db.subrecurso中的sr连接到subre中。idSubrecurso等于sr.idSubrecurso
来自子目录中的sr.DefaultIfEmpty()
在sr.idRecurso上的db.recurso中加入r等于r.idRecurso到recur中
从recur.DefaultIfEmpty()中的r
其中ec.idEvento==idEvento
选择新的客户群{
preciosventa=pventa,
EventoClient=ec,
客户=c,
NombreSubrecurso=sr.nombre==null?“:sr.nombre,
NombreRecurso=r.NombreRecurso==null?”(无保留)“:r.NombreRecurso
}).OrderBy(m=>m.eventoclient.nroReserva);
返回PartialView(客户);
}
结果如下:

我不知道为什么它会给我重复的行,只有当列有2个值(“ViewModel中的preciosventa”)时才会发生,最后我尝试使用groupby和hashSet删除重复的行,但没有成功。
非常感谢

我非常肯定你评论中的分组是正确的,并且会起作用。但是,您忘记了从该分组中实际选择某些内容,因此您仍然拥有所有副本-只是将它们分组在一起:

var distinctClientsPerEvent = clientesPorEvento.GroupBy(m => m.cliente.nombreCliente)
                                               .Select(x => x.FirstOrDefault());
您的分组由一个或多个类型为
ClientsPorEvento
(clientsporevent?我的西班牙语不是最好的)的对象组成。如果分组中有多个对象,则表示所有其他对象都是重复的。我们只选择第一个,将有一个重复的免费ViewModel

还有一件事:正如我在评论中所说的,我不会对可能发生变化的事情进行分组,比如名字。ID是永久的,请使用它们。 在您的示例中,如果“Maria”订购了一些票,与某人结婚,在您的系统中更改了她的姓名并订购了更多的票,您的分组将失败,因为她的姓名已更改。
这是极不可能的,但最好是安全的。

你是说GroupBy使用Name列无法删除重复项?是的,我尝试了类似的方法但没有成功:IEnumerable ClientSporeventoGroup=ClientSporevento.GroupBy(m=>m.cliente.nombreclient);单靠分组是不够的。您还需要从分组中选择所需的项目。但就个人而言,我会在PrimaryKey/Id列上分组。名字来来往往。ID是灵魂绑定的。