2009-12-12 7 views
5

Итак, Linq не поддерживает тип данных Geography, который бросает главный гаечный ключ в работу в прекрасном «табличке перетаскивания на модель дизайна поверхности Linq».Linq & неподдерживаемые типы данных (география)

Есть ли способ расширить Linq для работы с типом географии? Или мне нужно будет создать целый новый datalayer и набор запросов, когда мне нужно использовать столбцы географии?

Я застрял на этом несколько дней и не могу разобраться, если это возможно.

ответ

1

Looks like вам придется вручную отображать/анализировать его самостоятельно на свой собственный тип POCO.

3

Ввести столбец в varbinary (max), который Linq to SQL может дескриптор. Один из способов избежать этого в каждом запросе - просто добавить вычисленный столбец, определенный как CAST(GeographyColumn AS varbinary(max)).

После того, как у вас есть данные byte[], вы можете написать короткий Служебный метод для преобразования его в фактический Microsoft.SqlServer.Types.SqlGeography класса с использованием MemoryStream и IBinarySerialize. Read/Write методов.

Насколько я знаю, это единственное работающее решение, если вам нужно работать с любым типом CLR, включая географию, геометрию, иерархию и любые пользовательские типы. Linq не поддерживает «изначально» ни один из них. Это немного боль, чтобы написать весь шаблонный код, но вы можете упростить его с помощью нескольких методов расширения.

Вы не сможете запросить колонку таким образом; однако вы можете получить то, что я бы назвал наполовину, используя Linq Dynamic Query Library. У вас не будет intellisense или некоторых других фишек Linq, но он по-прежнему является составным и поэтому лучше, чем ручной поиск каждого запроса, и вы можете получить сильные результаты.

Обновление: Я нашел немного более чистое решение here. Вы можете использовать конструктор таким образом; просто добавьте свойство обертки в частичный класс и используйте метод STGeomFromWKB с классом SqlBytes. Тем не менее это все равно не даст вам возможности встроенного запроса.

+0

Хорошо, но это ничего не поможет, чтобы помочь мне запустить пространственные запросы, не так ли? Я имею в виду, мне все равно придется создавать свои собственные запросы, если я хочу, чтобы делал подобные 'SELECT X WHERE Y.STIntersects (X)' –

+0

Да, вы, к сожалению, даже если бы был лучший способ уговорить Linq к SQL, чтобы принять тип CLR в качестве столбца, он все равно не знал, как сопоставить свои методы с вызовами функций SQL. Лучше всего писать эти запросы как SP или UDF в самом SQL Server, но если вы абсолютно должны написать свой SQL в приложении, то вы сможете получить то, что хотите, используя Linq Dynamic Query Library. – Aaronaught

+0

Я обновил ответ ссылкой, если вы не знакомы с DynamicQuery. – Aaronaught