, чтобы создать weekin () Метод расширения , что:
- generic и работает по любым iqueryable . /> принимает: < /p>
a type Table Type (TDep) - Основной запрос репо (Strong> Repo (TMain)
- Два выражения Lambda для match (pk/fk или другое) .
- Необязательное состояние для применения фильтрации. /> < /ul>
< /li>
проверяет, если какая -либо запись в зависимой таблице (TDep) имеет совпадение с tmain . - Если соответствует, хранит tdep имя таблицы и сопоставленные значения ключей в « словаре (или списке) для дальнейшего использования. Внутренний словарь.
- Поддерживает нелинейные зависимости (т.е. цепочки Speaking () не зависят друг от друга).
- enderse-shordsyncresultas-ynependceplesultasync-in. Была найдена любая зависимость.
await _traineeRepo.GetAll()
.Where(t => t.Id == input.Id)
.LookIn(_traineeRegistrationRepo.GetAll(), tr => tr.Id, t => t.Id == tr.TraineeId)
.LookIn(_scoreRepo.GetAll(), s => s.Id, tr => tr.Id == s.RegistrationId)
.LookIn(_finalScoreRepo.GetAll(), tfs => tfs.Id, tr => tr.Id == tfs.RegistrationId)
.GetDependencyCheckResultAsync();
< /code>
[*] TMain, tdep может быть Любой класс/Таблица [/b].
[*] Значения ключей, используемые для соединения, могут быть email, String, Guid и т. Д. , а не просто int. Расширение и поддержка цепочки.
[*] TMain и tdep может быть или не связанными с ними. Проверьте < /strong> и добавьте ошибку, если обнаружены зависимости. < /p>
< /li>
< /ul>
Как улучшить или повторно обойти это, чтобы: < /p>
. Dictionary: {typeof (tdep) .name: list
} .
[*] Запрещается проверка зависимости, даже если промежуточный взгляд ()
[*] dyneck
< /th>
< /tr>
< /thead>
< /tr>
< /thead>
< /tr>
< /thead>
/>Abp.EntityFrameworkCore.EFPlus
5.13.0
Microsoft.EntityFrameworkCore.SqlServer
3.1.5
I want to build a generic, reusable LINQ extension method LookIn() for entity lookup between any tables in my ASP.NET Zero project, with key matching, dictionary caching, optional filtering, и поддержка как для зависимых, так и независимых поисков таблицы в прикованном вызове LINQ. Как я могу построить его чисто и эффективно?public static class GenericEntityHelper
{
[ThreadStatic]
private static List _dependencyTables;
private static List DependencyTables => _dependencyTables ??= new List();
public static IQueryable LookIn(
this IQueryable mainQuery,
IQueryable dependentQuery,
Expression mainKeySelector,
Expression depKeySelector,
Expression condition = null)
where TMain : class
where TDep : class
{
var filteredMain = condition != null ? mainQuery.Where(condition) : mainQuery;
var keyValues = filteredMain.Select(mainKeySelector).ToList();
var depParam = depKeySelector.Parameters[0];
var body = Expression.Call(
Expression.Constant(keyValues),
typeof(List).GetMethod("Contains", new[] { typeof(TKey) }),
depKeySelector.Body
);
var lambda = Expression.Lambda(body, depParam);
bool hasDependency = dependentQuery.Any(lambda);
if (hasDependency)
{
DependencyTables.Add(typeof(TDep).Name);
}
return mainQuery;
}
public static async Task GetDependencyCheckResultAsync(this IQueryable query)
{
if (DependencyTables.Any())
{
var message = $"Cannot delete. Dependent data found in: {string.Join(", ", DependencyTables)}";
DependencyTables.Clear();
throw new Abp.UI.UserFriendlyException(message);
}
DependencyTables.Clear();
await Task.CompletedTask;
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... cy-check-i