首页 > 解决方案 > 在 JSON 中获取相同值的多条记录

问题描述

我正在努力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; }
}

如何设置我的查询,以便在间隔后获取所有不同的记录?

任何帮助将不胜感激。

标签: c#jsonentity-frameworklinq

解决方案


我试过你的代码。似乎按预期工作。看来您的问题在于数据本身。您是否检查过存储数据的逻辑?如果您的数据中有重复项,自然会检索到重复项。

编辑: 我认为存储数据部分的问题存在误解。我问的不是你在数据库中的存储方式,而是你如何持久化数据。您如何持久化数据或持久化数据是如何存储的?在您到达此之前是否有任何获取逻辑:

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


推荐阅读