【问题标题】:LINQ could not be translated in asp.netLINQ 无法在 asp.net 中翻译
【发布时间】:2022-10-16 01:41:08
【问题描述】:

我收到这个错误。

var query = DbContext.Registries.AsNoTracking().ProjectTo<Registry>(Mapper.ConfigurationProvider);
        if (onlyMine) {
            query = from registry in DbContext.Registries.AsNoTracking()
                    join member in DbContext.RegistryMembers.AsNoTracking() on registry.Id equals member.RegistryId into members
                    from membership in members.DefaultIfEmpty()
                    where onlyMine && membership.MemberId == userId
                    select new Registry {
                        Id = registry.Id,
                        Customer = new Customer {
                            Id = registry.Customer.Id,
                            Name = registry.Customer.Name,
                        },
                        Title = registry.Title,
                        Membership = membership.Role
                    };
        }
        if (!string.IsNullOrWhiteSpace(options.Search)) {
            var term = options.Search.Trim().ToLowerInvariant();
            query = query.Where(x => x.Title.ToLower().Contains(term) ||  x.Customer.Name.ToLower().Contains(term));
        }
        return await query.ToResultSetAsync(options);

我收到以下错误

System.InvalidOperationException:LINQ 表达式'DbSet .LeftJoin(外部:DbSet,内部:d => EF.Property(d,“CustomerId”),outerKeySelector:d0 => EF.Property(d0,“Id”),innerKeySelector: (o, i) => new TransparentIdentifier<DbRegistry, DbCustomer>( Outer = o, Inner = i)) .OrderBy(d => EF.Property(d.Inner, "Id") == null ? null : new Customer { Id = d.Inner.Id, Name = d.Inner.Name } .Name)' 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。

【问题讨论】:

  • 你能在 Github repo 中提供一个工作重现吗?如果无法查看完整的数据模型,您可能会陷入没有任何答案的困境。
  • 我在这里看不到排序。你忘了张贴什么吗?

标签: c# asp.net linq


【解决方案1】:
var query = DbContext.Registries.AsNoTracking().ProjectTo<Registry>(Mapper.ConfigurationProvider);
    if (onlyMine) {
        query = from registry in DbContext.Registries.AsNoTracking()
                join member in DbContext.RegistryMembers.AsNoTracking() on registry.Id equals member.RegistryId into members
                from membership in members.DefaultIfEmpty()
                where onlyMine && membership.MemberId == userId
                select new Registry {
                    Id = registry.Id,
                    Customer = new Customer {
                        Id = registry.Customer.Id,
                        Name = registry.Customer.Name,
                    },
                    Title = registry.Title,
                    Membership = membership.Role
                };
    } else if (isVendor) {
        query = from registry in DbContext.Registries.AsNoTracking()
                join member in DbContext.RegistryMembers.AsNoTracking() on registry.Id equals member.RegistryId into members
                from membership in members.DefaultIfEmpty()
                select new Registry {
                    Id = registry.Id,
                    Customer = new Customer {
                        Id = registry.Customer.Id,
                        Name = registry.Customer.Name,
                    },
                    Title = registry.Title,
                    Membership = membership.Role
                };
    }
    if (!string.IsNullOrWhiteSpace(options.Search)) {
        var term = options.Search.Trim().ToLowerInvariant();
        query = query.Where(x => x.Title.ToLower().Contains(term) ||  x.Customer.Name.ToLower().Contains(term));
    }
    return await query.ToResultSetAsync(options);

【讨论】:

  • 删除此非答案并更新原始问题。再一次,没有排序,这在例外中提到。
猜你喜欢
  • 2021-06-23
  • 2020-10-26
  • 2022-10-20
  • 2021-03-01
  • 2021-12-28
  • 2020-03-11
  • 1970-01-01
  • 2022-12-03
相关资源
最近更新 更多