Преобразование guid в строку с структурой объекта - PullRequest
2 голосов
/ 20 февраля 2012

Я пытаюсь передать GUID в виде строки через веб-сервисы, однако я натолкнулся на дорогу.GUID хранится в SQL Server как UNIQUEIDENTIFIER, а EF извлекает его как GUID.В моем запросе я хотел бы сделать следующее:

var query = myEntities.Foo.Where(q => q.Id== Id)
                .Select(bar =>
                        new Bar()
                            { BString = bar.GUID }
                        );

Теперь C # выдает ошибку сборки, которую вы не можете преобразовать System.Guid в string, поэтому я думаю, что вы могли бы сделатьэто:

{ BString = bar.GUID.ToString() }

или даже

{ BString = Convert.ToString(bar.GUID) }

Но оба заканчиваются исключением во время выполнения:

Было исключение, это было System.NotSupportedException: LINQобъектам не распознается метод метода System.String ToString (System.Object), и этот метод нельзя преобразовать в выражение хранилища.

Поэтому я понимаю, что в обоих случаях это неспособен вычислить эквивалент T-SQL перехода от UniqueIdentifier до varchar.

Есть ли способ обойти это, кроме извлечения объекта, затем итерации по моему возвращаемому набору, копируя каждый объект в новый объекти преобразовать guid-> string в этот момент?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 20 февраля 2012

Преобразовать его в строку за пределами части запроса оператора LINQ.

var query = myEntities.Foo.Where(q => q.Id== Id).Select(r => r.GUID)
  .AsEnumerable()
  .Select(guid =>
    new Bar()
    { BString = guid.ToString() }
  );

Важная часть .AsEnumerable(): она преобразует результат из IQueryable вIEnumerable, приводящий к выполнению любых дальнейших операций на клиенте после выполнения запроса к базе данных.(Вы также можете использовать .ToArray() или .ToList() вместо него.)

0 голосов
/ 20 февраля 2012

Если производительность не имеет значения, вам, вероятно, следует повторно сопоставить GUID со строками вручную, как вы сами себе предложили:

var query = from entity in myEntities.Foo
            where entity.Id == Id
            select new { GUID = entity.GUID };
var response = from item in query.ToList()
               select new Bar { BString = item.GUID }

Это похоже на то, что предлагает @Tim Rogers, но явно разбитона два запроса.

Другой вариант, который я придумал, - написание хранимой процедуры, которая преобразует GUID в строки, используя собственный оператор T-SQL convert().Это поможет обойти невозможность EF автоматически сопоставлять GUID со строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...