我正在研究WEB API
。我创建了一个api
,其中提供了详细信息。详细信息应在nth
间隔之后。下面是我的代码。
var mainDetails = kesc.tj_xhqd.Where(m => (m.zdjh == msn) && (m.sjsj >= dt)).AsEnumerable()
.Select((x, i) => new { MSN = x.zdjh, PingDateTime = x.sjsj, PingValue = x.xhqd, i = i })
.Where(x => x.i % interval == 0)
.ToList();
return Request.CreateResponse(HttpStatusCode.OK, new { details = mainDetails });
输出为
{
"details": [
{
"MSN": "002999001180",
"PingDateTime": "2018-05-16T18:39:52",
"PingValue": "19",
"i": 0
},
{
"MSN": "002999001180",
"PingDateTime": "2018-05-16T18:39:52",
"PingValue": "19",
"i": 24
},
{
"MSN": "002999001180",
"PingDateTime": "2018-05-16T18:39:52",
"PingValue": "19",
"i": 48
},
{
"MSN": "002999001180",
"PingDateTime": "2018-05-16T18:39:52",
"PingValue": "19",
"i": 72
},
{
"MSN": "002999001180",
"PingDateTime": "2018-05-16T18:39:52",
"PingValue": "19",
"i": 96
},
.
.
.
.
.
{
"MSN": "002999001180",
"PingDateTime": "2018-05-16T18:39:52",
"PingValue": "19",
"i": 144
},
]
}
i
的值会增加,但其他详细信息会一次又一次地重复。
实际上,ping值每2分钟出现一次,ping值可以相同,但日期时间不同。
更新1
下面是我直接从数据库获取的表快照
从上面的图片中可以清楚地看到,仅ping值(即19)重复了几次,但日期时间仅是一次,但日期时间2018-05-16T18:39:52
却被多次显示
更新2
这是实现我的模型的数据库上下文
public partial class kescEntities : DbContext
{
public kescEntities()
: base("name=kescEntities")
{
this.SetCommandTimeOut(10000);
}
public void SetCommandTimeOut(int Timeout)
{
var objectContext = (this as IObjectContextAdapter).ObjectContext;
objectContext.CommandTimeout = Timeout;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<tj_xhqd> tj_xhqd { get; set; }
}
如何设置查询间隔的方式以获取所有不同的记录?
任何帮助将不胜感激。
答案 0 :(得分:2)
我已经尝试过您的代码。似乎按预期工作。看来您的问题出在数据本身上。 您是否检查了存储数据的逻辑?如果数据中有重复项,自然会检索到重复项。
编辑: 我认为对存储数据部分的问题存在误解。这不是您在数据库中存储的方式,而是您如何持久存储数据。您如何持久存储数据或如何存储持久数据?在您到达此位置之前,是否有任何提取逻辑:
var mainDetails = kesc.tj_xhqd <--- 这家伙
我测试过代码的部分:
class Program
{
static void Main(string[] args)
{
Random r = new Random();
List<Chingamajig> chinga = new List<Chingamajig>();
string[] verylongnum = new string[] { "00000000002312312", "34234002342342" };
int[] somenum = new int[] { 7, 14, 12, 28 };
for(int i = 0;i<100;i++)
{
Chingamajig c = new Chingamajig();
c.VeryLongNumbers = verylongnum[r.Next(0, 2)];
c.DateValue = DateTime.Now.AddMinutes((double)r.Next(-100, 101));
c.SomeNumber = somenum[r.Next(0, 4)];
chinga.Add(c);
}
foreach (Chingamajig c in chinga.OrderBy(x => x.VeryLongNumbers).ThenBy(y => y.DateValue).ThenBy(z => z.SomeNumber))
{
Console.WriteLine("{0} : {1} : {2}", c.VeryLongNumbers, c.DateValue, c.SomeNumber);
}
var m = "00000000002312312";
var dt = DateTime.Now.Date;
var interval = 2;
var ee = chinga.Where(x => (x.VeryLongNumbers == m) && (x.DateValue >= dt)).AsEnumerable()
.Select((z, i) => new { MSN = z.VeryLongNumbers, PingDT = z.DateValue, PingV = z.SomeNumber, i = i })
.Where(x => x.i % interval == 0).ToList();
Console.Clear();
foreach(var n in ee)
{
Console.WriteLine("{0} : {1} : {2} : {3}", n.MSN, n.PingDT, n.PingV, n.i);
}
Console.ReadLine();
}
}
public class Chingamajig
{
public string VeryLongNumbers { get; set; }
public DateTime DateValue { get; set; }
public int SomeNumber { get; set; }
}
是的。我确实用模拟数据测试了您的代码,因为您的示例代码几乎没有内容。
更新: 尝试将其添加到您的代码中
var mainDetails = kesc.tj_xhqd
//This line
.AsNoTracking()
.Where(m => (m.zdjh == msn) && (m.sjsj >= dt))
.AsEnumerable()
.Select((x, i) => new { MSN = x.zdjh, PingDateTime = x.sjsj, PingValue = x.xhqd, i = i })
.Where(x => x.i % interval == 0)
.ToList();
不确定,但是此问题似乎是由于没有pkey的表引起的。虽然不确定您的情况,但下面是供您参考的链接 Identical Rows