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();