我有这个LINQ查询,它通过Entity Framework查询SQL Express数据库,但在Visual Studio中以这种方式写入时不返回唯一行:
var q = from s in _db.SD
where s.ID == ID && s.Time >= startDate && s.Time <= endDate
select s
它返回正确的行数,但每行的数据与第一行相同。但是,当我在LinqPad中测试相同的查询时,返回的结果很好,即每行中正确的行数和唯一数据。
其次,如果我尝试将声明更改为:
var q = from s in _db.SD
where s.ID == ID && s.Time >= startDate && s.Time <= endDate
select s.Data
然后我在每一行中获得了正确的行数和唯一值。 有人可以帮我解决代码问题吗?
提前致谢。 编辑: 这是完整的功能:
public List<SD> GetHistory(int ID, DateTime startDate, DateTime endDate)
{
var q = (from s in _db.SD
where s.ID == ID &&
s.Time >= startDate && s.Time <= endDate
select s).ToList();
return q;
}
答案 0 :(得分:0)
当您使用select s.Data
获取正确的不同数据时,您可以在Comparer
类中编写实现IEqualityComparer<>
的{{1}}类,如下所示:
SD
然后您可以在public class SD
{
public Int16 ID { get; set; }
public Byte MT { get; set; }
public Byte Data { get; set; }
public Byte SS { get; set; }
public DateTime Time { get; set; }
public class Comparer : IEqualityComparer<SD>
{
public bool Equals(SD x, SD y)
{
return x.Data == y.Data; // look...here I m using 'Data' field for distinction
}
public int GetHashCode(SD obj)
{
unchecked // overflow is fine
{
int hash = 17;
hash = hash * 23 + obj.Data.GetHashCode();
return hash;
}
}
}
}
方法中编写GetHistory()
方法,如下所示:
Comparer
常规查询使用默认(引用相等)来检查两个对象是否相等。
因此,为了使Distinct()
以您想要的方式工作,您必须实施public List<SD> GetHistory(int ID, DateTime startDate, DateTime endDate)
{
var list = new List<SD>();
var q = (from s in list
where s.ID == ID &&
s.Time >= startDate && s.Time <= endDate
select s).Distinct(new SD.Comparer()).ToList();
return q;
}
。否则,它将使用默认(引用相等)进行检查,这意味着只有在它们是完全相同的实例时才会确定元素不是不同的。 See the reference here.