Пожалуйста, дайте мне знать, что правильно?
e.gLambda: context.tablename.where (условие); // Должен ли я пойти с этим
LINQ: (отT в таблице, где t. (Условие)); // или это?
Краткий ответ: это не имеет значения.Поскольку context.tablename
в конечном итоге возвращает IQueryable<T>
, Entityframework будет не пытаться обратиться к базе данных, пока вы не попытаетесь повторить конечный результат из своего выражения, не говоря уже о .ToArray()
и .ToList()
каждое,выполняет эту итерацию за вас.
Либо вы использовали синтаксис выражения LINQ (который компилируется как методы LINQ) или методы LINQ, когда вы пытаетесь начать итерацию результатов, Entityframework создает Expression
дерево для вас под капотом, которое полностью состоит из вашего запроса (включая Where
с, Join
с, GroupBy
с и т. д.).Поскольку структура LINQ может не точно соответствовать структуре запроса SQL (или любого другого запроса к источнику данных), в зависимости от источника (т. Е. Базы данных, например, SQL Server), Entityframework затем пытается сделать наилучшую возможную оптимизацию для вашего выражения.дерево, чтобы его структура соответствовала исполняемому запросу на источнике (например, запрос SQL Server).Наконец, оно преобразует это дерево выражений в реальный запрос и выполняет его в отношении источника данных и возвращает ваши данные (конечно, после выполнения всех отображений).
Если вы действительно, и я имею в виду ДЕЙСТВИТЕЛЬНО Если вы хотите разобраться в сложностях работы IQueryable
движка, я бы предложил пройтись по серии Мэтта Уоррена: ' LINQ: Создание серии поставщиков IQueryable '.Это на самом деле не Entityframework, но она разделяет ту же концепцию.