如何解决System.InvalidOperationException:LINQ表达式
我在webapi(.NET Core 3.1)中设置了一个异步方法,使用linq搜索数据库并获取每个类别的编号,然后将其返回到控制器中。我使用Swagger进行测试,但始终存在错误。我不知道错误在哪里。我可以寻求帮助吗?
服务:
public async Task<ClassficationSimpleInfo[]> SearchZulib(string token,string keyWord)
{
var data = zudb.ZuFileinfo.Include(x => x.Classify).Where(x => x.IsHiden != 1)
.Where(x => keyWord == "" || x.FamilyName.Contains(keyWord) || x.Description.Contains(keyWord))
.GroupBy(x => x.Classify)
.Select(x => new { classify = x.Key,count = x.Count() })
.ToList();
var result = data.Select(x => new ClassficationSimpleInfo(x.classify.Name,x.classify.ClassificationCode)
{
Count = x.count,Folder = x.classify.Folder,}).ToArray();
return result;
}
控制器:
[HttpGet]
[Route("Controller/SearchZulib")]
public async Task<ClassficationSimpleInfo[]> SearchZulib(string token,string keyWord)
{
return await service.SearchZulib(token,keyWord);
}
相关类的定义:
namespace ZulibWebServer.Entities
{
public class ClassficationSimpleInfo
{
public int Id { get; set; }
public string ClassifyCode { get; set; }
public string Name { get; set; }
public int Count { get; set; }
public string Folder { get; set; }
public bool Existed { get; set; }
public ClassficationSimpleInfo(string name,string classifyCode)
{
Name = name;
ClassifyCode = classifyCode;
}
}
}
namespace ZulibWebServer.Models
{
public partial class ZuFileinfo
{
public int FileId { get; set; }
public string FamilyName { get; set; }
public string FileUrl { get; set; }
public int ClassifyId { get; set; }
public string Description { get; set; }
public byte[] ThumbImage { get; set; }
public int? MinVer { get; set; }
public string LargeImage { get; set; }
public int IsHiden { get; set; }
public string UploaderName { get; set; }
public int? UploaderId { get; set; }
public virtual ZuClassfication Classify { get; set; }
}
}
public partial class ZuClassfication
{
public ZuClassfication()
{
ZuFileinfo = new HashSet<ZuFileinfo>();
ZuMapingrule = new HashSet<ZuMapingrule>();
}
public int ClassificationIdid { get; set; }
public string ClassifyName { get; set; }
public string ClassificationCode { get; set; }
public string RelQc { get; set; }
public string RelCbimcode { get; set; }
public string RelOminClass { get; set; }
public string Reluniformat { get; set; }
public string OtherCode { get; set; }
public string Name { get; set; }
public int? ParentCodeId { get; set; }
public string Folder { get; set; }
public virtual ICollection<ZuFileinfo> ZuFileinfo { get; set; }
public virtual ICollection<ZuMapingrule> ZuMapingrule { get; set; }
}
}
但是错误响应是
system.invalidOperationException:LINQ表达式'DbSet
其中(z => z.IsHiden!= 1)
.where(z => False || z.FamilyName.Contains(__ keyWord_0)|| z.Description.Contains(__ keyWord_0))
.Join(外部:DbSet,内部:z => EF.Property>(z,“ ClassifyId”),externalKeySelector:z0 => EF.Property>(z0,“ ClassificationIdid”),innerKeySelector:(o,i)=>新的TransparentIdentifier(外部= o,内部= i))
.GroupBy(来源:z => z.Inner,keySelector:z => z.Outer)'。
以一种可以翻译的形式重写查询,或者通过插入对AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()的调用来显式切换到客户端评估。有关更多信息,请参见https://go.microsoft.com/fwlink/?linkid=2101038。
解决方法
我再次对其进行了测试,并在GroupBy(x => x.Classify)中发现了错误,因此我修改了代码以两次查询数据库。
var data =await zudb.ZuFileinfo
.Where(x => x.IsHiden != 1)
.Where(x => keyWord == "" || x.FamilyName.Contains(keyWord) || x.Description.Contains(keyWord))
.GroupBy(x => x.ClassifyId).Select(x => new { classifyId = x.Key,count = x.Count() })
.ToListAsync();
var classifies =await zudb.ZuClassfication.ToDictionaryAsync(x => x.ClassificationIdid);
var result = data.Select(x =>
{
if (!classifies.TryGetValue(x.classifyId,out var classify)) return null;
return new ClassficationSimpleInfo(classify.Name,classify.ClassificationCode)
{
Count = x.count,Folder = classify.Folder,};
}).ToArray();
最后,我成功了。
,我再次对其进行了测试,发现GroupBy(x => x.Classify)中的错误
是的,通过导航属性进行分组是无效的。
此外,您可以通过linq简化查询,如下所示:
var data = zudb.ZuFileinfo.Include(x => x.Classify).Where(x => x.IsHiden != 1)
.Where(x => keyWord == "" || x.FamilyName.Contains(keyWord) || x.Description.Contains(keyWord))
.GroupBy(x => x.ClassifyId)
.Select(x => new { classifyId = x.Key,count = x.Count() })
.ToList();
var result = (from d in data
join c in zudb.ZuClassfication on d.classifyId equals c.ClassificationIdid
select new ClassficationSimpleInfo(c.Name,c.ClassificationCode)
{
Count = d.count,Folder = c.Folder
}).ToArray();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。