выражение Linq 'X => New attributeValue {key = x.key, value = x.value}. Либо переписать запрос в форме, которая может быть переведена, либо переключиться на оценку клиента, вставив «Asenumerable ' /' tolist '... < /p>
< /blockquote>
minimal repro < /strong> < /p>
entity + ef mapping (
Код: Выделить всё
jsonbКод: Выделить всё
public class Product
{
public Guid Id { get; set; }
public string Name { get; set; } = default!;
// jsonb
public List Values { get; set; } = new();
}
public class AttributeValue
{
public string Key { get; set; } = default!;
public string Value { get; set; } = default!;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var jsonOpts = new JsonSerializerOptions(JsonSerializerDefaults.Web);
modelBuilder.Entity(eb =>
{
eb.Property(e => e.Values)
.IsRequired()
.HasColumnType("jsonb")
.HasConversion(
v => JsonSerializer.Serialize(v, jsonOpts),
v => JsonSerializer.Deserialize[*]>(v, jsonOpts) ?? new())
.Metadata.SetValueComparer(new ValueComparer(
(a,b) => JsonSerializer.Serialize(a, jsonOpts) == JsonSerializer.Serialize(b, jsonOpts),
v => JsonSerializer.Serialize(v, jsonOpts).GetHashCode(),
v => JsonSerializer.Deserialize(JsonSerializer.Serialize(v, jsonOpts), jsonOpts)!));
});
}
< /code>
dto + projection map: < /p>
public class ProductDto
{
public Guid Id { get; set; }
public string Name { get; set; } = default!;
// This is the collection coming from jsonb
public List Values { get; set; } = new();
}
public static class ProductMap
{
public static readonly Expression ToDto =
p => new ProductDto
{
Id = p.Id,
Name = p.Name,
// This is the problematic bit:
Values = p.Values, // jsonb via HasConversion
};
}
< /code>
Resolver: < /p>
[GraphQLName("product")]
[UseFirstOrDefault] // single result
[UseProjection] // projections MUST be last
public IQueryable GetProduct(Guid id, [Service] AppDbContext db) =>
db.Products.AsNoTracking()
.Where(p => p.Id == id)
.Select(ProductMap.ToDto);
< /code>
graphql Query: < /p>
{
product(id: "…") {
id
name
values { key value }
}
}
< /code>
error < /p>
выражение Linq 'x => new attributevalue {key = x.key, value = x.value}' Не удалось перевести. Какой EF не может перевести, когда свойство отображается через HasConversion < /code> < /p>
Что я попробовал: < /p>
[list]
IsProjected(false)[*] Custom ObjectType + bindfieldsexplicital => new {... values = p.calues}) .Asemerable (). Выберите (x => new Productdto {values = x.values}) -> только работает, если [useProjection] отключена. Есть ли проекционный посетитель врезаться в элементы списка? Есть ли рекомендуемый шаблон, чтобы избежать внутреннего члена для таких свойств?
[*] Если да, то какой наименьший жизнеспособный обходной путь, который сохраняет проекции? />.net 9.0
[*] Горячий шоколад 15.1
[*] ef core 9.0
[/list]
Спасибо за какое -либо шаблон или подтверждение, что это ограничение и что подход x/y.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... nversionli
Мобильная версия