У меня есть несколько таблиц в базе данных, что они будут объединены в таблицу 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
состояние.
Заранее спасибо.