Я запрашиваю таблицу Store
, чтобы показать пользователю 10 ближайших Store
с. Я хотел бы отобразить Name
и Distance
из Store
, но предпочитаю сохранять расстояние в пользовательском объекте.
Store
поля: Id
, Name
, Latitude
, Longitude
, et c
StoreDto
поля: Id,
Имя ,
Расстояние`
Этот SO-ответ выводит нас на правильный путь, особенно с комментариями. Однако теперь DbQuery устарел.
В документах по типам объектов без ключей говорится, что мы можем использовать тип объекта без ключей, чтобы служить типом возврата для необработанных SQL запросов.
Мой DbContext уже имеет:
public DbSet<Store> Stores { get; set; }
Добавление
public DbSet<StoreDto> StoreDtos { get; set; }
И
modelBuilder.Entity<QuestSiteDto>()
.HasNoKey()
.ToView(null); // Hack to prevent table generation
Позволяет моему поисковому коду магазина работать. Но в следующий раз, когда я запущу миграцию, EF Core захочет создать таблицу StoreDto, если только я не добавлю этот уродливый ToView(null)
хак.
Для справки, вот мой запрос:
var sql =
@"select
geography::Point({0}, {1}, 4326).STDistance(geography::Point(Latitude, Longitude, 4326)) / 1609.34 as Distance,
Id,
[Name]
from
Store"
var results = await StoreDtos
.FromSqlRaw(sql, latitudeUnsafe, longitudeUnsafe)
.OrderBy(x => x.Distance)
.Take(10)
.ToListAsync();
Как правильно это сделать? Если вы считаете, что знаете рекомендуемый способ, не могли бы вы привести свой источник? На момент этой публикации страница «Типы без ключа» на странице c больше фокусировалась на представлениях и таблицах, чем на необработанных запросах (если я что-то пропустил).