csrss Ответов: 1

Ядро EF, массивы дескрипторов


Всем привет. Это моя сущность, которая хранится в базе данных:
public class Rule
{
    [Key]
    public int ruleId { get; set; }
    public string name { get; set; }
    public int[] categoryIds { get; set; }
}


У меня есть конвертеры для этого типа:
public class ArrayConverter : ValueConverter<int[], string>
{
    public ArrayConverter()
        : base(x => string.Join(";", x), x => x.Split(";", StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray())
    {
    }
}

public class ArrayComparer : ValueComparer<int[]>
{
    public ArrayComparer()
        : base((c1, c2) => c1.SequenceEqual(c2), c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())), c => c.ToArray())
    {
    }
}


Конвертеры применяются следующим образом:

modelBuilder.Entity<Rule>(builder =>
   {
       builder.Property(x => x.categoryIds).HasConversion(new ArrayConverter());
       builder.Property(x => x.categoryIds).Metadata.SetValueComparer(new ArrayComparer());
   });


Что я уже пробовал:

И это работает нормально, на стороне клиента. Мне нужно как-то использовать это свойство (
int[] categoryIds
) на стороне сервера вместо этого. Он хранится в строковом столбце следующим образом: 1;2;3
Каков наилучший способ добиться этого с помощью linq to sql?
Я пробовал эф.Свойство<string>(p, "categoryIds").Содержит("1"), но он терпит неудачу с некоторой ошибкой, что ef.property используется неправильно. Мне нужно запустить его на стороне сервера.
categoryIds не привязаны к объекту Rule, они являются общесистемными сущностями, используемыми всеми другими сущностями, поэтому я не могу этого сделать:
public ICollection<Category> categories {get;set;}
потому что категория должна была бы иметь отношение к правилу, а оно не может иметь такого.

1 Ответов

Рейтинг:
10

Gerry Schmitz

Если вам нужна "строка", чтобы действовать как "список", просто добавьте еще один Геттер; EF / LINQ это не волнует.

public string Categories {get;set;} = "1;2;3";
public ICollection<string> CatList {get{return this.Categories.Split(';').ToList();}}


Richard Deeming

Нет необходимости в этом .ToList() вызовите туда; массив, возвращенный Split уже реализует ICollection<string>. :)

csrss

Спасибо