问题描述
var commodity = _appDbContext.ArchivesCcommodity.Where(lambda)
.GroupJoin(_appDbContext.ArchivesCcommoditySpecification,a => a.Code,b => b.commodity,(a,b) => new { a,b })
.SelectMany(a => a.b.DefaultIfEmpty(),b) => new { a.a,b })
.GroupJoin(_appDbContext.ArchivesCSpecificationDetail,a => a.a.a.b.SpecificationDetail,d => d.Code,d) => new { a,d })
.SelectMany(a => a.d.DefaultIfEmpty(),d) => new
{
commodity = a.a.a.Code,commodityName = a.a.a.Name,SpecificationDetailName = d.Name,OrderSN = d.OrderSN
}).AsQueryable().OrderBy(a => a.OrderSN).GroupBy(a => new { a.commodity,a.commodityName })
.Select(a => new
{
commodity = a.Key.commodity,commodityName = a.Key.commodityName,SpecificationDetailName = string.Join(" - ",a.Select(a => a.SpecificationDetailName)),SpecificationDetailTotal = string.Join(" - ",a.Select(a => a.SpecificationDetailName)) == "" ? 0 : a.Count()
});
其中 .AsQueryable() 会导致错误
.AsQueryable()
.OrderBy(a => a.OrderSN)
.GroupBy(a => new { a.commodity,a.commodityName })
改成AsEnumerable()不会报错
.ASEnumerable()
.OrderBy(a => a.OrderSN)
.GroupBy(a => new { a.commodity,a.commodityName })
但是我暂时不想把这段代码发送到数据库中,因为它会在分页查询后发送。不知道怎么处理?
////////////我把我的完整代码贴出来,说说我的实际需求
查询代码,逐页查询数据库。例如,只检查一页和 10 行记录。这里没问题。
var AA= _appDbContext.ArchivesCcommodity.Where(lambda)
.GroupJoin(_appDbContext.ArchivesCcommoditySpecification,b })
.SelectMany(a => a.b.DefaultIfEmpty(),b })
.GroupJoin(_appDbContext.ArchivesCSpecificationDetail,a => a.a.b.SpecificationDetail,d })
.SelectMany(a => a.d.DefaultIfEmpty(),d) => new
{
commodity = a.a.a.a.a.Code,commodityName = a.a.a.a.a.Name,OrderSN = d.OrderSN
});
PageHealper<object> page = new PageHealper<object>();
page.Start(pageNum,pageSize);
page = await page.RestPage(AA);
这时候又分组整理了一下,现在发现:
var BB = AA.AsEnumerable().OrderBy(a => a.OrderSN).GroupBy(a => new { a.commodity,a.commodityName,a.Specification,a.SpecificationName })
.Select(a => new
{
commodity = a.Key.commodity,a.Select(a => a.SpecificationDetailName)) == "" ? 0 : a.Count()
}); ;
page.Data = BB.ToList<object>();
return page;
解决方法
查看这篇文章https://weblogs.asp.net/zeeshanhirani/using-asqueryable-with-linq-to-objects-and-linq-to-sql,了解 AsQueryable 的作用。
我认为你真的不需要 AsQueryable ...... LINQ to SQL 不喜欢该查询的某些内容。
它不喜欢 String.Join(...) 因为它无法翻译它。
所以你可以做的一件事是将 .AsEnumerable() 放在 GroupBy() 之后,这将在 SQL 中执行所有操作,然后在内存中执行所有操作。
例如:
var commodity = _appDbContext.ArchivesCCommodity.Where(lambda)
.GroupJoin(_appDbContext.ArchivesCCommoditySpecification,a => a.Code,b => b.Commodity,(a,b) => new { a,b })
.SelectMany(a => a.b.DefaultIfEmpty(),b) => new { a.a,b })
.GroupJoin(_appDbContext.ArchivesCSpecificationDetail,a => a.a.a.b.SpecificationDetail,d => d.Code,d) => new { a,d })
.SelectMany(a => a.d.DefaultIfEmpty(),d) => new
{
Commodity = a.a.a.Code,CommodityName = a.a.a.Name,SpecificationDetailName = d.Name,OrderSN = d.OrderSN
}).OrderBy(a => a.OrderSN).GroupBy(a => new { a.Commodity,a.CommodityName })
.AnEnumerable()
.Select(a => new
{
Commodity = a.Key.Commodity,CommodityName = a.Key.CommodityName,SpecificationDetailName = string.Join(" - ",a.Select(a => a.SpecificationDetailName)),SpecificationDetailTotal = string.Join(" - ",a.Select(a => a.SpecificationDetailName)) == "" ? 0 : a.Count()
});