Некоторые проблемы с GroupJoin в двух таблицах от LinQ - PullRequest
0 голосов
/ 31 марта 2019

У меня есть несколько таблиц в базе данных, что они будут объединены в таблицу Log.

Вот одна из таблиц, и после этого я показал Log таблицу

Пользователь сущность :

public class User : BaseEntity
{
    public User()
    {
        Beneficiaries = new HashSet<Beneficiary>();
        Applicants = new HashSet<Applicant>();
        UserItemCategories = new HashSet<UserItemCategory>();
        UserPropertyCategories = new HashSet<UserPropertyCategory>();
        Payments = new HashSet<Payment>();
    }

    [Required]
    public Role Role { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    [Required]
    public string Mobile { get; set; }

    [Required]
    public string Username { get; set; }

    [Required]
    public string Phone { get; set; }

    [Required]
    public string Address { get; set; }

    [Required]
    public string Password { get; set; }

    public double FixedSalary { get; set; }
    public DateTime DateOfPay { get; set; }
    public virtual ICollection<Beneficiary> Beneficiaries { get; set; }
    public virtual ICollection<Applicant> Applicants { get; set; }
    public virtual ICollection<UserItemCategory> UserItemCategories { get; set; }
    public virtual ICollection<UserPropertyCategory> UserPropertyCategories { get; set; }
    public virtual ICollection<Payment> Payments { get; set; }
}

BaseEntity класс:

public abstract class BaseEntity
{
    public string Id { get; set; }

    public DateTime DateTime { get; set; }
}

Журнал entity :

public class Log : BaseEntity
{
    public TrackTypeEnum Type { get; set; }

    [Required]
    public string CreatorId { get; set; }

    [Required]
    public string EntityId { get; set; }
}

В таблице Log я хотел присоединить entityId к User Id таблицы. Я написал код для обработки этого:

public static IQueryable<TEntity> Filtered<TEntity>(this IQueryable<TEntity> entities, IQueryable<Log> logDbSet) where TEntity : BaseEntity
{
    var entitiesWithAttachedLogs = entities
        .GroupJoin(logDbSet, entity => entity.Id, log => log.EntityId, (entity, logs) => new
        {
            Entity = entity,
            Logs = logs
        });

    var groupedEntities = entitiesWithAttachedLogs.GroupBy(key => key.Entity.Id, value => new
    {
        value.Entity,
        Logs = value.Logs.DefaultIfEmpty()
    });

    var shrinkGroup = groupedEntities.SelectMany(group => group, (group, item) => new
    {
        TrackedEntity = item
    });

    var condition = shrinkGroup.Where(x =>
        (x.TrackedEntity.Logs == null || !x.TrackedEntity.Logs.Any())
        || (x.TrackedEntity.Logs.Any() && x.TrackedEntity.Logs.OrderBy(c => c.DateTime).FirstOrDefault().Type != TrackTypeEnum.Delete));
    var catchEntity = condition.Select(x => x.TrackedEntity.Entity);

    return catchEntity;
}

Некоторые строки могут не иметь никакого статуса журнала.

Я собираюсь получить "NotDeleted" пользователей:

var models = _users.Filtered(_logs);
var foundUser = await (from user in models
                       where user.Id == currentUser.Id
                       where user.Username == currentUser.Username
                       where user.Mobile == currentUser.Mobile
                       where user.Role == currentUser.Role
                       where user.Password == currentUser.EncryptedPassword
                       where user.FirstName == currentUser.FirstName
                       where user.LastName == currentUser.LastName
                       where user.Phone == currentUser.Phone
                       select user).FirstOrDefaultAsync().ConfigureAwait(false);
return foundUser != null; 

Но когда я хочу получить пользователей, которыеони не удаляются (на основе свойства Log Type), он возвращает эту ошибку:

InvalidCastException: Unable to cast object of type 'DefaultIfEmptyAsyncIterator`1[RealEstate.Domain.Tables.Log]' to type 'System.Collections.Generic.IEnumerable`1[RealEstate.Domain.Tables.Log]'. 

, пожалуйста, помогите мне исправить это и получите конкретные строки, которые они не удаляютв соответствии с Log состояние.

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...