В этой статье автор подробно представляет совместный запрос Linq, потому что, боюсь, читатели плохо понимают этот аспект, поэтому прежде чем говорить о совместном запросе Linq, я сначала расскажу вам о том, как реализуется совместный запрос Linq, надеясь помочь вам.
Сначала давайте разберёмся с некоторыми знаниями о совместном запросе Linq.
1. Анонимный тип доставки
static void Main(string[] args) { var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); Console.Write (User.UserName); } статический объект GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; вернуть пользователя;
} Когда мы определяем анонимный тип, он может быть передан только через тип объекта, и компилятор не будет знать фактический тип этого типа после передачи.
Эту линию можно откладывать методом расширения Cast. Ниже приведён прототип метода Cast.
публичный статический T Cast (этот объект o, T t) { return ();
} 2. Как сгенерировать анонимный список типов для федеративного запроса Linq?
var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); var list = новый список< ?>(); Принцип такой же, как и вышеописанное.
var User = новый { Имя пользователя = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); Список. Add(User); Console.Write(list[0]. Имя пользователя); Давайте рассмотрим метод MakeList():
public static List MakeList (this T t) { вернуть новый список();
} Конечно, вы можете подумать, что вышеуказанный метод недостаточно совершенен, и вам нужно добавить пользователя в Список, поэтому у вас есть следующий способ:
публичный статический список состава (этот T t, параметры T[] items) { вернуть новый список (элементы); } При вызове его можно записать так:
var User = новый { Имя пользователя = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(User); Console.Write(list[0]. Имя пользователя); На этот раз давайте перейдём к сути и разберёмся, как реализуется федеративный запрос Linq.
var q = от p в db. Продукция где p.Supplier.Country == «США» && p.UnitsInStock == 0 выберите p; Приведённый выше запрос — это две связанные таблицы, и возвращается только содержимое одной таблицы; в данном случае в слое данных может быть возвращен сильно типизированный List. Например:
Публичный список SelectProducts() { var q = из p в db. Продукция где p.Supplier.Country == «США» && p.UnitsInStock == 0 выберите p; возврат q.ToList;
} Если возвращённый набор результатов больше двух таблиц, как его следует передавать? Вы, наверное, думали, что если возврат результатов — это одна строка данных, мы можем использовать анонимный тип доставки, о котором мы упоминали ранее, чтобы получить нужные результаты. Общественный объект
публичный объект SelectProducts() { var q = из p в db. Продукция где p.Supplier.Country == «США» && p.UnitsInStock == 0 выберите новые {p.UnitsInStock,p.Supplier.Sid}; var результат = q.Single(); результат возврата;
} Однако эта предпосылка заключается в том, что слой бизнес-логики должен знать конкретные типы типов анонимности на уровне данных. Это многослойное наложение мало что значит. Это не то, чего мы хотим. Кроме того, метод использования анонимного типа List для возврата набора результатов многостроковых данных также провалился после экспериментов. Это означает, что ни один из двух способов передачи анонимности в начале этой статьи не сработает.
Метод 1: Federated запрос Linq настраивает классы с той же структурой, что и тип возврата
публичный класс CustomQuery { public uint UnitsInStock { get; декорация; } публичный int Sid { get; декорация; }
} Это можно решить, если результаты запроса представляют собой множество результатов из нескольких таблиц. Поскольку вам нужно знать тип анонимности, необходимо определить дополнительный класс, помимо того, что он не соответствует многослойному. Но это верно и может дать нужные результаты с помощью сильных типов.
Метод 2: Federated запрос Linq с использованием делегирования System.Func (Ссылка: Возврат var из метода в C# 3.0)
Слой данных:
public IEnumerable GetCustomersWithOrders(Func, TProjection> проекция) { возврат от клиента в _customers пусть customerOrders = от заказа в _orders где порядок. CustomerID = customer.ID выбрать проекцию (клиент, заказы клиента);
} Слой бизнес-логики:
var results = GetCustomersWithOrders( (клиент, заказы) => новый { Имя = клиент. Имя, OrderCount = приказы. Count() }); Результат, возвращаемый таким образом, по-прежнему остаётся истинно анонимным типом на уровне бизнес-логики и может использоваться напрямую.
Метод 3: Federated запросы Linq используют хранящиеся процедуры или представления. |