Да, вы можете сделать это, используя проекцию a.k.a. select
. Выбор LINQ to SQL позволяет оптимизировать запрос и извлекать только то, что необходимо. Существует два основных сценария. Один из них движется вверх по реляционному дереву, от многих к одному, а другой - от одного до многих. Вот пример из многих один:
var unshippedOrders =
from order in db.Orders
where order.ShipDate == null
select
{
OrderId = order.Id,
CustomerId = order.Customer.Id,
CustomerName = order.Customer.Name
};
А вот пример от одного ко многим:
var unshippedOrdersPerCustomer =
from customer in db.Customers
select
{
CustomerId = customer.Id,
CustomerName = customer.Name
UnshippedOrders =
from order in customer.Orders
where order.ShipDate == null
select
{
OrderId = order.Id,
OrderPrice = order.Price
}
};
Как вы можете видеть, во втором запросе У меня есть еще один вспомогательный запрос, LINQ к SQL решит это для вас. В моих примерах я использовал анонимные типы, но вы также можете использовать простые старые именованные типы. Я думаю, вы даже можете смешать свой LINQ to SQL-код с LINQ to XML, создав узлы XElement прямо в вашем запросе LINQ to SQL :-). Небо это предел.
Какая черта, позвольте привести пример, если LINQ to SQL + XML.
XElement xml = new XElement("customers",
from customer in db.Customers
select new XElement("customer",
from order in customer.Orders
where order.ShipDate == null
select new XElement("order",
new XAttribute("id", order.Id),
new XAttribute("price", order.Price)
)
));
Console.WriteLine(xml);
Есть ли способ сделать это автоматически? Нет, не то, что я знаю. Однако я могу предложить подход, который вы, возможно, захотите попробовать. У меня нет рабочего примера этого, но он должен работать. Вы можете использовать отражение, чтобы изучить свойства вашего корневого объекта, ища свойства, которые являются EntitySets (детские коллекции). Каждый раз, когда вы его находите, вы можете использовать эту информацию для программной сборки DataLoadOptions на лету. Добавьте тире рекурсии, некоторую дублирующую проверку, и вы должны быть установлены. – Mel
@Mel - интересная идея - я мог бы посмотреть на что-то подобное, но я начинаю немного настороженно относиться к (a) большому результату SQL, чтобы с нетерпением загрузить все и (б) выполнить одну медленную операцию и добавить отражая это, чтобы сделать это немного медленнее ... Вернемся к чертежной доске, я думаю. – Paddy