Я создал класс-оболочку, в которой хранятся статические функции. для всех типичных запросов LINQ, таких как .Where, .FirstOrDefault и т. д.
Вот пример:
Код: Выделить всё
public abstract class QueryableTable where T : QueryableTable, new()
{
public static Func QueryInitializer;
public static List Where(Expression predicate, bool eagerLoad = false)
{
using (var context = new DatabaseContext())
{
return QueryInitializer(context, eagerLoad).Where(predicate).ToList();
}
}
}
Код: Выделить всё
[Table("comment")]
public class Comment : QueryableTable
{
[Key]
public int Id { get; set; }
public int PersonId { get; set; }
// Navigation property
public Person Person { get; set; }
static Comment()
{
QueryableTable.QueryInitializer = (context, eagerLoad) =>
{
return eagerLoad ?
context.Set().Include(t => t.Person) as IQueryable :
context.Set();
};
}
}
Однако, если я сразу вызову его, не вызывая сначала статический конструктор Comment, я получу исключение нулевой ссылки в QueryInitializer, как и ожидалось.
Все это имеет смысл, но сначала я пытаюсь найти элегантный способ вызова статического конструктора перед статическим методом, а во-вторых, я пытаюсь убедить себя, что хотя этот дизайн будет полезно на практике из-за простоты запросов с помощью статических методов Class.Where(), делать эти методы статическими нецелесообразно.
Подробнее здесь: https://stackoverflow.com/questions/790 ... in-c-sharp
Мобильная версия