在JSON中获取具有相同值的多个记录

时间:2018-06-26 10:54:09

标签: c# json entity-framework linq

我正在研究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

下面是我直接从数据库获取的表快照

InceptionV3

从上面的图片中可以清楚地看到,仅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; }
}

如何设置查询间隔的方式以获取所有不同的记录?

任何帮助将不胜感激。

1 个答案:

答案 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

相关问题