LINQ除非按预期工作

时间:2017-05-05 16:40:13

标签: c# asp.net .net asp.net-mvc linq

我有一些方法可以返回过去360天,180天和90天内未查询过的联系人列表。

在过去361天内未被查询过的人,也将在180天90天的查询中退回。

我以为我可以用Except做到这一点,但那肯定不行,

public class Contacto
{
    public int IdContacto { get; set; }
    public string PrimerApellido { get; set; }
    public string PrimerNombre { get; set; }
    public string SegundoApellido { get; set; }
    public string SegundoNombre { get; set; }
    public object Telefonos { get; set; }
    public int TipoTelefono { get; set; }
    public int IdEstado { get; set; }
    public DateTime? FechaArchivado { get; set; }
    public DateTime? FechaConsulta { get; set; }

GetOldContacts方法

private static List<Contacto> GetOldContacts(int numberOfDays)
{
    try
    {
        DateTime filter = DateTime.Now.AddDays(-numberOfDays);
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(ConfigurationSettings.Apiurl);
        HttpResponseMessage response = client.GetAsync("api/ContactosDepurar?FechaInicial="+filter.ToShortDateString()).Result;
        if (response.IsSuccessStatusCode)
        {
            return response.Content.ReadAsAsync<List<Contacto>>().Result;
        }
        else
        {
            System.Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
            return null;
        }
    }
    catch (Exception ex)
    {
        System.Console.WriteLine(ex.Message);
        return null;
    }

}

我的逻辑

IEnumerable<Contacto> contactosDoceMeses = GetOldContacts(ConfigurationSettings.Ciclo3Dias);
IEnumerable<Contacto> contactosSeisMeses = GetOldContacts(ConfigurationSettings.Ciclo2Dias).Except<Contacto>(contactosDoceMeses);
IEnumerable<Contacto> contactosTresMeses = GetOldContacts(ConfigurationSettings.Ciclo1Dias).Except<Contacto>(contactosSeisMeses);

问题是第二个查询正在返回第一个项目,而不应该

1 个答案:

答案 0 :(得分:4)

Linq的ExceptEquals()比较对象。您需要覆盖Contacto&#39 {s} EqualsGetHashCode

许多先前的问题解释了如何:

Except还有一个重载,如果您希望实现一个而不是覆盖函数,则会收到IEqualityComparer

用于指定比较器内联查看: