我有一个成功的查询,它将两个表与where和orderby子句链接起来,但我想添加到只选择特定列而不是让所有内容都恢复。
第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部分 我还想知道我是否可以将选定的列提取到视图模型类中,所以我厌倦了这个,并且我在orderby行上获得了与上面相同的结果
错误4无法将类型'System.Linq.IOrderedQueryable'隐式转换为'System.Linq.IQueryable'。存在显式转换(您是否错过了演员?)
答案 0 :(得分:1)
<强> ANSWER 强>
我认为你帮助我偶然发现了类型不匹配的事实。制作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;
}
答案 1 :(得分:0)
第一个示例需要var
,因为您通过投影到匿名类型来更改查询的形状。第二个示例可以使用var
或IQueryable<VendorProfileViewModel>
,因为您要通过投影到VendorProfileViewModel
来更改查询的形状。