Вам необходимо запросить оба списка и выбрать несколько элементов из второго списка, которые имеют одинаковый идентификатор с одним элементом в первом списке
public JsonResult gFbrRecord()
{
DataSet ds1 = dblayer.gfbrdata();
List<fbrData> lstrng1 = new List<fbrData>(10000);
//Your other stuff here
DataSet ds2 = dblayer.gfbrdata();
List<fbr1> lstrng2 = new List<fbr1>(10000);
//Your other stuff here
var result = (from item1 in lstrng1
select new
{
FBRInvoiceNumber = item1.FBRInvoiceNumber,
POSID = item1.POSID,
SRL_NUM = item1.SRL_NUM,
Data = (from item2 in lstrng2
where item2.SRL_NUM == item1.SRL_NUM
select new
{
DetailSerialNo = item2.DetailSerialNo,
ItemCode = item2.ItemCode
}).ToList()
}).ToList();
return Json(result, "application/json", JsonRequestBehavior.AllowGet);
}
Альтернатива
В основном я предоставляю вам пример кода, который должен работать для объединения двух объектов json
1) Этот метод извлекает записи из базы данных и заполнить список, и затем из этого списка будет создана JToken
public static JToken Method1()
{
DataSet ds = dblayer.gfbrdata();
List<fbrData> lstrng = new List<fbrData>(10000);
//Your other stuff here
JToken jToken = JToken.FromObject(lstrng);
return jToken;
}
JToken
возврат по вышеуказанному методу выглядит как
[
{
"FBRInvoiceNumber": "ABC",
"POSID": 110034,
"SRL_NUM": 123
},
{
"FBRInvoiceNumber": "PQR",
"POSID": 210035,
"SRL_NUM": 456
}
]
2) Этот метод также аналогичен описанному выше методу, но единственное отличие состоит в том, что этот метод извлекает записи из базы данных, отличной от вышеуказанного метода.
public static JToken Method2()
{
DataSet ds = dblayer.gfbrdata();
List<fbr1> lstrng = new List<fbr1>(10000);
//Your other stuff here
JToken jToken = JToken.FromObject(lstrng);
return jToken;
}
JToken
возвращаемый вышеописанным методом выглядит как
[
{
"DetailSerialNo": 8,
"ItemCode": "700275",
"SRL_NUM": 123
},
{
"DetailSerialNo": 9,
"ItemCode": "800279",
"SRL_NUM": 456
}
]
3) Теперь функция ниже может объединять каждый из объектов в обоих массивах по одному и тому же индексу.
Поскольку вы упомянули в комментарии выше, что
вы хотите объединить каждый ваш объект в обоих массивах по одному ключу свойства SRL_NUM
значение.
public static JToken Concat(JToken jToken1, JToken jToken2)
{
JArray jArray = new JArray();
foreach (JObject jObject1 in jToken1.ToObject<JArray>())
{
var value1 = jObject1.Properties().Where(x => x.Name == "SRL_NUM").FirstOrDefault().Value;
foreach (JObject jObject2 in jToken2.ToObject<JArray>())
{
var value2 = jObject2.Properties().Where(x => x.Name == "SRL_NUM").FirstOrDefault().Value;
if (Convert.ToInt32(value1) == Convert.ToInt32(value2))
{
jObject1.Merge(jObject2, new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Concat });
jArray.Add(jObject1);
}
}
}
return jArray;
}
4) Тогда йоВы можете использовать вышеуказанный метод для вашего метода действия
public ContentResult gFbrRecord()
{
JToken jToken1 = Method1();
JToken jToken2 = Method2();
var result = Concat(jToken1, jToken2);
return Content(result.ToString(), "application/json");
}
Вывод:
Edit1:
Если ваш массив содержит более одного SRL_NUM
во втором массиве, то приведенный ниже метод может объединить все элементы с одинаковым SRL_NUM
с первым элементом массива с таким же SRL_NUM
.
public static JToken Concat(JToken jToken1, JToken jToken2)
{
JArray jArray = new JArray();
foreach (JObject jObject1 in jToken1.ToObject<JArray>())
{
var value = jObject1.Properties().Where(x => x.Name == "SRL_NUM").FirstOrDefault().Value;
var result = jToken2.ToObject<JArray>().ToObject<JObject[]>().Properties().Where(x => x.Name == "SRL_NUM" && Convert.ToInt32(x.Value) == Convert.ToInt32(value)).Select(x => x.Parent);
JArray jAr = new JArray();
foreach (JObject obj in result)
{
jAr.Add(obj);
}
JObject jObject = new JObject();
jObject.Merge(jObject1, new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Concat });
jObject.Add("Data", jAr);
jArray.Add(jObject);
}
return jArray;
}
Выход: