2015-10-30 2 views
0

Окружающая среда: EF6 код первогоEntity Framework: лучший способ выполнить многие запросы?

У меня есть две таблицы, например user и activity, которые имеют много-ко-многим.

Я хочу знать, имеет ли какое-либо действие пользователя заданный ключ, используя Entity Framework в приложении asp.net mvc.

  1. является следующим результатом оценки результатов?

  2. есть ли другой способ написать этот запрос?

Запрос:

var userEntity = _dbcontext.Users.Find(userId); 

var isAvailable = _dbcontext.Entry(userEntity) 
          .Collection(e => e.Activities) 
          .Query().Any(e => e.Name== "givenname"); 

обновление:

я побежал эти запросы, и здесь время выполнения:

var userEntity = _dbcontext.Users.Find(userId); 

var isAvailable = userEntity.Activities.Any(a => a.Name == "givenname"); 

Время: 5.39s + время для извлечения пользователем

var isAvailable =_dbcontext.Users.Include(e => e.Activities) 
          .Any(u => u.UserId == userId 
            && u.Activities.Any(a => a.Name == "givenname") 
           ); 

Время: 5.73s

var userEntity = _dbcontext.Users.Find(userId); 

var isAvailable = _dbcontext.Entry(userEntity) 
         .Collection(e => e.Activities) 
         .Query().Any(e => e.Name== "givenname"); 

время: 5.95s + время для извлечения пользователя

поэтому кажется, что выбор второй формы запроса будет разумным.

ответ

1

Вы также можете попробовать это:

var isAvailable =_dbcontext.Users.Include(e => e.Activities) 
           .Any(u => u.UserId == userId 
             && u.Activities.Any(a => a.Name == "givenname") 
            ); 

Если вы не отключили отложенной загрузки, то вам не нужно вызывать метод Include расширения.

1

Я бы упростить это:

var userEntity = _dbcontext.Users.Find(userId); 

var isAvailable = userEntity.Activities.Any(a => a.Name == "givenname"); 

или, может быть (я не совсем понятно, что вы пытаетесь достичь, из вашего вопроса) - это не принимать во внимание userId, его просто ищет любых пользователей, имеет любую деятельность с givenname:

var isAvailable = _dbcontext.Users.Any(u => u.Activities.Any(a => a.Name == "givenname")); 
+0

нет только одного пользователя, который является текущим пользователем, а также есть ли какой-либо способ без первого получения пользователя? – 1AmirJalali

0

Одно путешествие в БД:

var result = _dbcontext.Users.Where(u => u.UserId == userId) 
    .Select(u => new { 
     User = u, // optional 
     IsAvailable = u.Activities.Any(a => a.Name == "givenname") 
    }) 
    .SingleOrDefault(); 
+0

таблица действий имеет много отношения к пользователю, поэтому _dbcontext.Activities.Any (a => a.UserId) невозможно – 1AmirJalali

+0

ах, поэтому просто следуйте второму примеру, возвращаемый объект пользователя не является обязательным – Moho

Смежные вопросы