我有一个成功的查询,它将两个表与where和orderby子句链接起来,但我想添加到只选择特定的列而不是将所有的东西都回来。实体框架 - 选择特定列
第1部分 当我尝试这样做时,如果我删除orderby行的语法错误移动到where行,我会在orderby行上得到语法错误。
错误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();
PART 2 我也想知道如果我能提取选中的列到视图模型类,所以我厌倦了这个,我也得到相同的结果。上面的命令行
错误4不能将类型'System.Linq.IOrderedQueryable'隐式转换为'System.Linq.IQueryable'。存在明确的转换(您是否缺少演员?)
使用'var'而不是'IQueryable'? –
Pawel
2013-03-20 18:23:03
@Pawel不知道我可以,有几个选择性的子句后面的查询(添加到OP)。你能否为上述代码提出另一个可行的解决方案? – SQLGrinder 2013-03-20 18:28:57
为什么? var只是让编译器推断出正确的类型,如果你明确地设置类型并且类型根据你返回的内容是无效的。你可以将鼠标悬停在'var'上来查看类型究竟是什么。目前它就好像你有一个返回字节的函数,但是如果你使用'var myVal = GetByte();''编译器会知道myVal('string myVal = GetByte '应该是字节,并将它编译为一个字节变量。换句话说,在运行时,它将始终是强类型的,但是在编译时你要求编译器完成肮脏的工作。 – Pawel 2013-03-20 18:42:23