Как я могу проанализировать строку в UNIQUEIDENTIFIER?

.net entity-framework entity-framework-6 guid sql-server

Вопрос

Я пишу запрос LINQ Entity Framework, в котором я хочу разбирать строку в UNIQUEIDENTIFIER (aka GUID) как часть WHERE :

public IEnumerable<User> Find(Guid guid)
{
    return dbContext
        .Users
        .Where(user => Guid.Parse(user.GuidText) == guid);
}

Я знаю, что это возможно в SQL, потому что я тестировал его:

SELECT *
FROM Users
WHERE CAST(GuidText AS UNIQUEIDENTIFIER) = @guid;

Однако я не нашел способ генерировать часть CAST . Я пробовал:

  1. (Guid)user.GuidText , который генерирует ошибку компилятора.
  2. Convert.ToGuid(user.GuidText) , но этот метод не существует.
  3. Guid.Parse(user.GuidText) , но это заставляет Entity Framework генерировать ошибку, когда она переводит запрос LINQ.
  4. new Guid(user.GuidText) , но это заставляет Entity Framework генерировать ошибку, когда она переводит запрос LINQ.
  5. (Guid)Convert.ChangeType(user.GuidText, typeof(Guid)) , но это заставляет Entity Framework генерировать ошибку, когда она переводит запрос LINQ.
  6. SqlGuid.Parse(user.GuidText) , но это заставляет Entity Framework генерировать ошибку, когда она переводит запрос LINQ.

Как я могу это достичь? Я готов вставить SQL в код в качестве последнего средства.

Популярные ответы

EF runtime фактически поддерживает преобразование из строки в GUID в качестве операции отбрасывания, но, как вы узнали, в настоящее время нет способа выразить это в LINQ, который мы поддерживаем.

Лучшим обходным решением, которое я могу придумать, является использование Entity SQL:

var objectContext = ((IObjectContextAdapter)db).ObjectContext;
var query = objectContext.CreateQuery<User>(
  "SELECT VALUE u FROM Context.Users AS u WHERE CAST(u.GuidText AS System.Guid) = @guid", 
  new ObjectParameter("guid", guid));



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему