Итак, я пытаюсь вернуть некоторые данные из своего API, в настоящее время он не возвращается так, как я хочу, я хочу, чтобы он возвращался как объекты внутри массива, но в настоящее время он возвращается как объекты внутри массивов внутри массива.
Это мой код:
[HttpGet("{CurrentUsername}")]
public IEnumerable<IEnumerable<Message>> GetMyMessageList(string currentUsername)
{
var currentUser = _context.Users.FirstOrDefault(x => x.Username == currentUsername);
var currentUserId = currentUser.Id;
var messageList = _context.Messages
.Where(x => x.SenderId == currentUserId || x.RecipientId == currentUserId)
.OrderByDescending(x => x.DateTimeSent)
.GroupBy(x => new
{
Smaller = x.SenderId < x.RecipientId ? x.SenderId : x.RecipientId,
Greater = x.SenderId > x.RecipientId ? x.SenderId : x.RecipientId,
})
.Select(x => x.OrderByDescending(p => p.DateTimeSent).Take(1));
return messageList;
}
В настоящее время это выглядит так:
[
[
{
"id": 4,
"senderId": 1,
"recipientId": 3,
"senderUsername": "jxchumber",
"recipientUsername": "pavster31",
"itemId": 0,
"messageContentString": "hello1",
"read": false,
"dateTimeSent": "2020-12-14T22:23:55.1473414"
}
],
[
{
"id": 3,
"senderId": 1,
"recipientId": 9,
"senderUsername": "jxchumber",
"recipientUsername": "larsen",
"itemId": 0,
"messageContentString": "hello1",
"read": false,
"dateTimeSent": "2020-12-14T16:04:50.8232055"
}
]
]
Я хочу, чтобы это выглядело так:
[
{
"id": 4,
"senderId": 1,
"recipientId": 3,
"senderUsername": "jxchumber",
"recipientUsername": "pavster31",
"itemId": 0,
"messageContentString": "hello1",
"read": false,
"dateTimeSent": "2020-12-14T22:23:55.1473414"
},
{
"id": 3,
"senderId": 1,
"recipientId": 9,
"senderUsername": "jxchumber",
"recipientUsername": "larsen",
"itemId": 0,
"messageContentString": "hello1",
"read": false,
"dateTimeSent": "2020-12-14T16:04:50.8232055"
}
]
Вы можете использовать SelectMany
, чтобы выбрать перечисляемое свойство из каждой строки и объединить их все в один список:
[HttpGet("{CurrentUsername}")]
public IEnumerable<Message> GetMyMessageList(string currentUsername)
{
var currentUser = _context.Users.FirstOrDefault(x => x.Username == currentUsername);
var currentUserId = currentUser.Id;
var messageList = _context.Messages
.Where(x => x.SenderId == currentUserId || x.RecipientId == currentUserId)
.OrderByDescending(x => x.DateTimeSent)
.GroupBy(x => new
{
Smaller = x.SenderId < x.RecipientId ? x.SenderId : x.RecipientId,
Greater = x.SenderId > x.RecipientId ? x.SenderId : x.RecipientId,
})
.SelectMany(x => x.OrderByDescending(p => p.DateTimeSent).Take(1));
return messageList;
}
Кроме того, вы можете указать, что вы выбираете первый элемент вместо коллекции с помощью FirstOrDefault
:
var messageList = _context.Messages
.Where(x => x.SenderId == currentUserId || x.RecipientId == currentUserId)
.OrderByDescending(x => x.DateTimeSent)
.GroupBy(x => new
{
Smaller = x.SenderId < x.RecipientId ? x.SenderId : x.RecipientId,
Greater = x.SenderId > x.RecipientId ? x.SenderId : x.RecipientId,
})
.Select(x => x.OrderByDescending(p => p.DateTimeSent).FirstOrDefault());
Однако это может включать в вывод пустые значения, если отфильтрованная коллекция не содержит элементов.
почему вы используете
OrderByDescending
дважды? можете ли вы заменитьTake(1)
наFirstOrDefault()
и проверить, может ли EF перевести его в SQL.