Версия 1.3 от Alexandr Fokin на 2026/04/02 19:16

Скрыть последних авторов
Alexandr Fokin 1.1 1 |(% style="width:186px" %) |(% style="width:1247px" %)Возможная реализация идеи фиксации правил в виде отдельных компонентов.
Alexandr Fokin 1.3 2 |(% style="width:186px" %) |(% style="width:1247px" %)[[IEnumerable>>doc:Разработка.NET.C#.Коллекции.IEnumerable.WebHome]], [[IQueryable>>doc:Разработка.NET.C#.Коллекции.IQueryable.WebHome]]
Alexandr Fokin 1.1 3 |(% style="width:186px" %)Пример компонента для фиксации правила/условия.|(% style="width:1247px" %)(((
4 |(% style="width:88px" %)InMemory condition|(% style="width:1104px" %){{code language="c#"}}public interface IInMemoryCondition<TData, TParameters>
5 {
6 /// <summary>
7 /// Проверить условие.
8 /// </summary>
9 /// <param name="source"></param>
10 /// <returns></returns>
11 bool Check(TData source, TParameters parameters);
12
13 /// <summary>
14 /// Фильтрация для InMemory.
15 /// </summary>
16 /// <param name="source"></param>
17 /// <returns></returns>
18 IEnumerable<TData> ApplayEnumerable(IEnumerable<TData> source, TParameters parameters);
19 }{{/code}}|{{code language="c#"}}public class DelegateInMemoryCondition<TData, TParameters>
20 : IInMemoryCondition<TData, TParameters>
21 {
22 private readonly Func<TData, TParameters, bool> _checkFunc;
23 private readonly Func<IEnumerable<TData>, TParameters, IEnumerable<TData>> _applayEnumerableFunc;
24
25 public DelegateInMemoryCondition(
26 Func<TData, TParameters, bool> checkFunc,
27 Func<IEnumerable<TData>, TParameters, IEnumerable<TData>>? applayEnumerableFunc = null)
28 {
29 _checkFunc = checkFunc;
30 _applayEnumerableFunc = applayEnumerableFunc
31 ?? ((source, parameter) => source.Where(e => Check(e, parameter)));
32 }
33
34 public bool Check(TData source, TParameters parameters)
35 {
36 return _checkFunc(source, parameters);
37 }
38
39 public IEnumerable<TData> ApplayEnumerable(IEnumerable<TData> source, TParameters parameters)
40 {
41 return _applayEnumerableFunc(source, parameters);
42 }
43 }{{/code}}
44 |(% style="width:88px" %)IQueryable condition|(% style="width:1104px" %){{code language="c#"}}public interface IQueryableCondition<TData, TParameters>
45 {
46 /// <summary>
47 /// Фильтрация для БД.
48 /// Может использовать специфичные для БД функции.
49 /// </summary>
50 /// <param name="source"></param>
51 /// <returns></returns>
52 IQueryable<TData> ApplayQueryable(IQueryable<TData> source, TParameters parameters);
53 }{{/code}}|{{code language="c#"}}public class DelegateIQueryableCondition<TData, TParameters>
54 : IQueryableCondition<TData, TParameters>
55 {
56 private readonly Func<IQueryable<TData>, TParameters, IQueryable<TData>> _applayQueryableFunc;
57
58 public DelegateIQueryableCondition(Func<IQueryable<TData>, TParameters, IQueryable<TData>> applayQueryableFunc)
59 {
60 _applayQueryableFunc = applayQueryableFunc;
61 }
62
63 public IQueryable<TData> ApplayQueryable(IQueryable<TData> source, TParameters parameters)
64 {
65 return _applayQueryableFunc(source, parameters);
66 }
67 }{{/code}}
Alexandr Fokin 1.2 68 |(% style="width:88px" %)Контейнер для агрегата.|(% style="width:1104px" %){{code language="c#"}} public interface TEntityConditions
Alexandr Fokin 1.1 69 {
70 public (
71 IInMemoryCondition<TEntity, long> Memory,
72 IQueryableCondition<TEntity, long> Query
73 ) ById { get; }
74
75 public (
76 IInMemoryCondition<TEntity, string> Memory,
77 IQueryableCondition<TEntity, string> Query
78 ) ByName { get; }
79
80 public (
81 IInMemoryCondition<TEntity, object?> Memory,
82 IQueryableCondition<TEntity, object?> Query
83 ) IsRule1 { get; }
84 }{{/code}}|
85
86
87 )))
88 |(% style="width:186px" %)Вспомогательный Extension|(% style="width:1247px" %)(((
89 |{{code language="c#"}}public static class IConditionExtension
90 {
91 public static IQueryable<TEntity> ApplayFilterCondition<TEntity, TParameter>(
92 this IQueryable<TEntity> source,
93 IQueryableCondition<TEntity, TParameter> condition,
94 TParameter parameter)
95 {
96 return condition.ApplayQueryable(
97 source,
98 parameter);
99 }
100
101 public static IEnumerable<TEntity> ApplayFilterCondition<TEntity, TParameter>(
102 this IEnumerable<TEntity> source,
103 IInMemoryCondition<TEntity, TParameter> condition,
104 TParameter parameter)
105 {
106 return condition.ApplayEnumerable(
107 source,
108 parameter);
109 }
110 }{{/code}}|
111 | |
112 | |
113
114
115 )))
116
117