2017-01-30 2 views
2

Следующий код прекрасно работает в LINQPad:не может бросить строки в GUID в LINQ для лиц

(from u in AspNetUsers 
    let userOrders = (from uo in UserOrders where uo.UserId == new Guid(u.Id) select uo) 
    select u) 

Однако, когда я пытаюсь выполнить один и тот же код из моего приложения MVC, это дает мне следующую ошибку:

var users = (from u in ctx.Users 
      let userOrders = (from uo in ctx.UserOrders where uo.UserId == new Guid(u.Id) select uo) 
      select u); 

Only parameterless constructors and initializers are supported in LINQ to Entities.

Я не помню, когда-либо какие-либо вопросы, конвертирование строки в GUID в Linq к Entities раньше. Мне не хватает ссылки?

Я уже включены все ссылки я мог думать о:

using System.Linq; 
using System.Data.Entity; 

Почему это работает в LINQPad, но не в MVC?

Edit: Как ни странно, это похоже на работу:

let userOrders = (from uo in ctx.UserOrders where uo.UserId.ToString() == u.Id select uo) 
+2

'new Guid (u.Id)' <= вы не можете это сделать (как указано в сообщении об исключении). Если вы использовали Linq для объектов (в памяти), вы могли бы это сделать, но это не могло быть переведено в хранилище данных. – Igor

+0

Также кажется, что это пользовательские таблицы, если вы, вероятно, хотите какой-либо FK, и в этом случае идентификаторы должны иметь одинаковый тип в любом случае, лучший вариант - исправить схему хранилища, чтобы соответствовать типам. – Igor

+0

Схема сама по себе не является «настраиваемой», она исходит из конструкции AspNetUsers по умолчанию из MVC, где идентификатор пользователя, GUID, представлен в виде строки. Я бы предпочел не менять его и хотел бы просто сопоставить его с другой таблицей. Должна быть простая функция, которая может преобразовать строку в 'uniqueindentifier'. Есть идеи? – user1477388

ответ

1

В конце концов, я просто решил пойти с более простым подходом кастинг моего GUID .ToString() так:

let userOrders = (from uo in ctx.UserOrders where uo.UserId.ToString() == u.Id select uo) 

Причиной в том, реализации по умолчанию AspNetUsers определяет столбец как VARCHAR, не uniqueidentifier, поэтому, чтобы изменить его, мне, вероятно, придется сделать что-то вроде этого How to make EF-Core use a Guid instead of String for its ID/Primary key, которого я сейчас не интересует!

1

Когда вы находитесь внутри контекста объект еще не реализован. Почему вы все равно не используете автоматические встроенные свойства навигации?

Если у вас есть внешний ключ в базе данных или структуре данных. Это создает свойство «navigation» в Entity Framework. Таким образом, вы можете быстрее перейти к дочерним объектам. Много раз они автоматически выдаются в зависимости от ваших вариантов EF от ленивой и нетерпеливой загрузки. «Включить» заставляет навигацию получать. Так что, если вы просто хотели заказать (отдельную таблицу) из моей таблицы, я бы допросил человека, а затем получил его дочернюю таблицу. Я также знаю, что существует концепция «реализованного» с Entity Framework и до тех пор, пока вы не сможете законно поставить что-то «ToList» или «ToString», если, если вы попытаетесь подключить слишком много под капотом, прежде чем они будут реализованы, они не сработают.

static void Main(string[] args) 
{ 
     using (var context = new TesterEntities()) 
     { 
     var peopleOrders = context.tePerson.Include("teOrder").First(p => p.PersonId == 1).teOrder.ToList(); 
     peopleOrders.ForEach(x => Console.WriteLine($"{x.OrderId} {x.Description}")); 
     } 
} 
Смежные вопросы