Ошибка при трансляции запроса к полю типа "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 шт):

Автор решения: CrazyElf

На английском СО рекомендуют для конвертации поля в строку на стороне SQL использовать функцию SqlFunctions.StringConvert. Видимо, в вашем случае будет как-то так:

public async Task<Switch?> GetSwitch(string ip)
{
    return await context.Switches.Where(s => 
        SqlFunctions.StringConvert(s.Ipaddr) == ip).FirstOrDefaultAsync();
}
→ Ссылка