2013-03-20 4 views
1

У меня есть успешный запрос, который связывает две таблицы с предложением where и orderby, но я хотел добавить только отдельные столбцы вместо того, чтобы все вернуть.Entity Framework - выбор конкретных столбцов

ЧАСТЬ 1 Когда я пытаюсь это сделать, я получаю синтаксические ошибки в строке orderby, если я удаляю строку orderby, синтаксические ошибки перемещаются в строку where.

Ошибка 3 Невозможно неявно преобразовать тип 'System.Linq.IOrderedQueryable' в 'System.Linq.IQueryable'. Явное преобразование существует (вы пропали без вести бросок?)

  IQueryable<VendorProfile> query = _db.VendorProfiles 
      .Include("VendorCategories") 
      .Include("VendorsSelected") 
      .Select(s => new { s.ProfileID, s.Name, s.CompanyName, s.City, s.State, s.DateCreated, s.VendorsSelected, s.VendorCategories }) 
      .Where(x => x.VendorsSelected.Select(s => s.UserName).Contains(HttpContext.Current.User.Identity.Name)) 
      .OrderBy(x => x.DateCreated); 

     if (criteria.name != string.Empty) 
      query = query.Where(v => v.Name.Contains(criteria.name)); 
     if (criteria.company != string.Empty) 
      query = query.Where(v => v.CompanyName.Contains(criteria.company)); 
     if (criteria.startDate != null && criteria.endDate != null) 
      query = query.Where(v => v.DateCreated > criteria.startDate && v.DateCreated < criteria.endDate); 
     if (criteria.categories != null && !criteria.categoryMatchAll) 
      query = query.Where(v => criteria.categories.AsQueryable().Any(cat => v.VendorCategories.Select(vendCat => vendCat.CategoryID).Contains(cat))); 
     if (criteria.categories != null && criteria.categoryMatchAll) 
      query = query.Where(v => criteria.categories.AsQueryable().All(cat => v.VendorCategories.Select(vendCat => vendCat.CategoryID).Contains(cat))); 
     if (criteria.minorityType != null) 
      query = query.Where(v => v.MinotiryOwned == criteria.minorityType); 
     if (criteria.diversityClass != null) 
      query = query.Where(v => v.DiversityClassification == criteria.diversityClass); 

     return query.ToList(); 

ЧАСТЬ 2 Я также хотел бы знать, если я мог бы извлечь выбранные столбцы в классе вид модели, так что я устал это и я получаю те же результаты, выше на строке порядка

Ошибка 4 Невозможно неявно преобразовать тип 'System.Linq.IOrderedQueryable' в 'System.Linq.IQueryable'. Явное преобразование существует (вы пропускаете листинг?)

+0

использовать 'var' вместо' IQueryable '? – Pawel

+0

@Pawel не уверен, что я могу, есть несколько выборочных предложений, которые следуют этому запросу (добавленному в OP). Можете ли вы предложить другое работоспособное решение для вышеуказанного кода? – SQLGrinder

+0

Почему? var просто позволяет компилятору вывести правильный тип, если вы явно задаете тип, а тип недействителен в соответствии с тем, что вы возвращаете. Вы можете навести курсор мыши на 'var', чтобы увидеть, что такое тип. В настоящее время это похоже на то, что у вас есть функция, которая возвращает байт, но вы присвоили результат строковой переменной ('string myVal = GetByte();'), если вы используете 'var myVal = GetByte();' компилятор будет знать, что 'myVal 'должен быть байтом и будет компилировать его как байтовую переменную. Другими словами, во время выполнения он всегда будет строго типизирован, но во время компиляции вы попросите компилятор выполнить грязную работу. – Pawel

ответ

1

ОТВЕТ

Я думаю, что вы помогли мне наткнуться на то, что типы не совпадают. Создание типа IQueryable и выбора нового типа и возвращаемого типа SAME делает синтаксис счастливым. Использование var не нравится.

public IEnumerable<BrowseVendorModel> SearchVendors(CustomSearchModel criteria) 
{ 
    IQueryable<BrowseVendorModel> query = _db.VendorProfiles 
     .Include("VendorCategories") 
     .Include("VendorsSelected") 
     .Select(s => new BrowseVendorModel 
     { 
      ProfileID = s.ProfileID, 
      Name = s.Name, 
      CompanyName = s.CompanyName, 
      City = s.City, 
      State = s.State, 
      DateCreated = s.DateCreated, 
      VendorsSelected = s.VendorsSelected, 
      VendorCategories = s.VendorCategories 
     }) 
     .Where(x => x.VendorsSelected.Select(s => s.UserName).Contains(HttpContext.Current.User.Identity.Name)) 
     .OrderBy(x => x.DateCreated); 

    if (criteria.name != string.Empty) 
     query = query.Where(v => v.Name.Contains(criteria.name)); 
    if (criteria.company != string.Empty) 
     query = query.Where(v => v.CompanyName.Contains(criteria.company)); 
    if (criteria.startDate != null && criteria.endDate != null) 
     query = query.Where(v => v.DateCreated > criteria.startDate && v.DateCreated < criteria.endDate); 
    if (criteria.categories != null && !criteria.categoryMatchAll) 
     query = query.Where(v => criteria.categories.AsQueryable().Any(cat => v.VendorCategories.Select(vendCat => vendCat.CategoryID).Contains(cat))); 
    if (criteria.categories != null && criteria.categoryMatchAll) 
     query = query.Where(v => criteria.categories.AsQueryable().All(cat => v.VendorCategories.Select(vendCat => vendCat.CategoryID).Contains(cat))); 
    if (criteria.minorityType != null) 
     query = query.Where(v => v.MinotiryOwned == criteria.minorityType); 
    if (criteria.diversityClass != null) 
     query = query.Where(v => v.DiversityClassification == criteria.diversityClass); 

    return query; 
} 
0

Первый пример требует var, потому что вы меняете форму запроса, проецируя его на анонимный тип. Второй пример может либо использовать var, либо IQueryable<VendorProfileViewModel>, потому что вы меняете форму запроса, проецируя его на VendorProfileViewModel.

+0

Thx. У меня такая же проблема, как и все вышеперечисленные предложения, которые ниже порядка orderby дают ошибки, поскольку они зависят от IQueryable. Есть ли другой способ, которым я могу получить как создание запросов, так и выбор полей для работы? – SQLGrinder

+0

Но у вас все еще есть 'IQueryable '. Если модель просмотра содержит те поля, которые вы используете, в тех случаях, когда они должны работать. –

+0

Я думаю, вы помогли мне наткнуться на то, что типы не совпадают. При создании типа IQueryable и выборе нового типа VendorProfileViewModel делает синтаксис счастливым. Использование var не нравится.Но все еще возникают проблемы с возвращенной страницей просмотра. – SQLGrinder

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