Asp.net mvc 4 实体框架-选择特定列

Asp.net mvc 4 实体框架-选择特定列,asp.net-mvc-4,entity-framework-5,Asp.net Mvc 4,Entity Framework 5,我有一个成功的查询,它使用where和orderby子句链接了两个表,但我想添加到select特定列,而不是返回所有内容 第一部分 当我尝试此操作时,orderby行上会出现语法错误,如果我删除orderby行,语法错误会移动到where行 错误3无法将类型“System.Linq.IOrderedQueryable”隐式转换为“System.Linq.IQueryable”。存在显式转换(是否缺少强制转换?) IQueryable查询=\u db.VendorProfiles .包括(“卖方类

我有一个成功的查询,它使用where和orderby子句链接了两个表,但我想添加到select特定列,而不是返回所有内容

第一部分 当我尝试此操作时,orderby行上会出现语法错误,如果我删除orderby行,语法错误会移动到where行

错误3无法将类型“System.Linq.IOrderedQueryable”隐式转换为“System.Linq.IQueryable”。存在显式转换(是否缺少强制转换?)

IQueryable查询=\u db.VendorProfiles
.包括(“卖方类别”)
.包括(“选定卖方”)
.Select(s=>new{s.ProfileID,s.Name,s.CompanyName,s.City,s.State,s.DateCreated,s.vendorselected,s.vendorscategories})
.Where(x=>x.vendorselected.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.DateCreatedcriteria.categories.AsQueryable().Any(cat=>v.VendorCategories.Select(vendCat=>vendCat.CategoryID).Contains(cat));
if(criteria.categories!=null&&criteria.categoriymatchall)
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.minotriyowned==criteria.minorityType);
if(criteria.diversityClass!=null)
query=query.Where(v=>v.DiversityClassification==criteria.diversityClass);
返回query.ToList();
第二部分 我还想知道是否可以将所选列提取到视图模型类中,因此我对此感到厌倦,并在orderby行上得到与上面相同的结果


错误4无法将类型“System.Linq.IOrderedQueryable”隐式转换为“System.Linq.IQueryable”。存在显式转换(是否缺少转换?

第一个示例需要
var
,因为您正在通过投影到匿名类型来更改查询的形状。第二个示例可以使用
var
IQueryable
,因为您正在通过投影到
VendorProfileViewModel
来更改查询的形状。第一个示例需要
var
,因为您正在通过投影到匿名类型来更改查询的形状。第二个示例可以使用
var
IQueryable
,因为您正在通过投影到
VendorProfileViewModel
中来更改查询的形状


我想是你帮我偶然发现了两种类型不匹配的事实。使IQueryable类型和selectnew类型以及return类型相同会使语法更符合要求。使用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;
}
public IEnumerable SearchVendors(CustomSearchModel标准)
{
IQueryable查询=_db.VendorProfiles
.包括(“卖方类别”)
.包括(“选定卖方”)
.选择(s=>new BrowseVendorModel
{
ProfileID=s.ProfileID,
Name=s.Name,
CompanyName=s.CompanyName,
城市=南部城市,
州=美国州,
DateCreated=s.DateCreated,
VendorsSelected=s.VendorsSelected,
VendorCategories=s.VendorCategories
})
.Where(x=>x.vendorselected.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.DateCreatedcriteria.categories.AsQueryable().Any(cat=>v.VendorCategories.Select(vendCat=>vendCat.CategoryID).Contains(cat));
if(criteria.categories!=null&&criteria.categoriymatchall)
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.minotriyowned==criteria.minorityType);
if(criteria.diversityClass!=null)
query=query.Where(v=>v.DiversityClassification==criteria.diversityClass);
返回查询;
}

回答


我想是你帮我偶然发现了两种类型不匹配的事实。使IQueryable类型和selectnew类型以及return类型相同会使语法更符合要求。使用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;
}
public IEnumerable SearchVendors(CustomSearchModel标准)
{
IQueryable查询=_db.VendorProfiles
.包括(“卖方类别”)
.包括(“选定卖方”)
.选择(s=>new BrowseVendorModel
{
ProfileID=s.ProfileID,
Name=s.Name,
CompanyName=s.CompanyName,
城市=南部城市,
州=美国州,
DateCreated=s.DateCreated,
VendorsSelected=s.VendorsSelected,
VendorCategories=s.VendorCategories
})
.Where(x=>x.vendorselected.Select(s=>s.UserNam