Ошибка при трансляции запроса к полю типа "inet" в postgreSql через linq и EF Core
У меня есть класс Entity, который содержит свойство Ipaddr типа IPАddress. В базу postgresql оно сохраняется в поле типа inet, как и задумывалось. Для поиска по этому полю использую такой метод:
public async Task<Switch?> GetSwitch(string ip)
{
return await context.Switches.Where(s =>
s.Ipaddr.ToString() == ip).FirstOrDefaultAsync();
}
При его вызове возникает ошибка:
System.InvalidOperationException: The LINQ expression 'DbSet() .Where(s => s.Ipaddr.ToString() == __ip_0)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
Подскажите, пожалуйста, как переписать код, чтобы Linq смог транслировать запрос к БД. Получать всю коллекцию, а потом ее фильтровать на стороне клиента не хочется, так как может быть очень много данных.
Ответы (1 шт):
На английском СО рекомендуют для конвертации поля в строку на стороне SQL использовать функцию SqlFunctions.StringConvert. Видимо, в вашем случае будет как-то так:
public async Task<Switch?> GetSwitch(string ip)
{
return await context.Switches.Where(s =>
SqlFunctions.StringConvert(s.Ipaddr) == ip).FirstOrDefaultAsync();
}