Wszystkie recordy, w których przynajmniej jeden record ma atrybut o danej wartości

0

Cześć, dziedziczę po takiej klasie :

public virtual IQueryable<TEntity> GetWhere(Expression<Func<TEntity, bool>> expression) => _dbSet.Where(expression);

moja implementacja (działam na zmockowanych danych):

//Entity <Floor>
var dummyData = DummyData();
return dummyData.Where(expression).AsQueryable();

i teraz mam problem, muszę zwrócić jeden floor, z jednym segmentem, który ma propke ExampleType = "example1".

Użycie już w aplikacji:

var test = _repo.GetWhere(f => f.Segments.Any(s => s.Model.DataType.ExampleType == "example1"));

Mianowicie Floor zawiera często wiele Segmentów, więc nawet gdy ExampleType == "example1", to zwraca też inne segmenty, które mają inne typy np. example2 itd.
Chciałbym aby w tym query pobrało tylko floory, tylko z segmentami, które spełniają ExampleType == "example1".

Próbowałem chainować to zapytanie na wiele sposóbów, ale niestety nie ogarniam.

1

Przemapuj Selectem i odfiltruj te złe exampleX.

0

Czy się da? tak

Ale nie tylko jest to troszkę brzydkie, to w dodatku jeżeli to używa EF, to na 99% nie przetłumaczy ci tego na SQL

Wydaje mi się że albo byś musiał jeszcze przekazać Funca do Selecta jako np. drugi overload tej metody, albo JOINa z Wherem zrobić

https://stackoverflow.com/questions/67534732/entity-framework-join-two-tables-and-where-clause

A może przestać używać repozytoriów? :P

using Newtonsoft.Json;

Func<TEntity, bool> expr = (TEntity t) =>
{
    if (t.Id == 5)
    {
        t.Items = t.Items.Where(x => x >= 3).ToList();

        return true;
    }

    return false;
};

var result = GetWhere(expr);
Console.WriteLine(JsonConvert.SerializeObject(result));

TEntity GetWhere(Func<TEntity, bool> expression)
{
    var data = new List<TEntity>
    {
        new TEntity
        {
            Id = 5,
            Items = new List<int> { 1, 2, 3 }
        },
        new TEntity
        {
            Id = 6,
            Items = new List<int> { 2, 3, 4 }
        }
    };

    var result = data.Where(expression).First();

    return result;
}

internal class TEntity
{
    public int Id { get; set; }

    public List<int> Items { get; set; }
}

Wynik:

{"Id":5,"Items":[3]}
4

Pierwszy raz widzę żeby ktoś tłumaczył angielskie “expression” w programistycznym sensie jako „ekspresja” :)

0

Czy da się to zrobić w tej jednej ekspresji (w metodzie GetWhere())?

Nieco zależy jak wyglądają modele, bo patrząć po tym, że chcesz by zwracało IQueryable to by sugerowało, że jest to operacja na bazie danych.
Obejściem tego może być to, że szukasz po Segments z czego zwrócą Ci się tylko rekordy "example1". Pobrać takie rekordy i pogrupować do odpowiednich Floor. Jednak to mapowanie będzie po stronie serwera już.

1 użytkowników online, w tym zalogowanych: 0, gości: 1