У меня есть одна таблица "заказы" с иностранным ключом "ProductID".
Я хочу отображать заказы в сетке с наименование товара, без LazyLoad для лучшей производительности, но если я использую DataLoadOptions, он извлекает поля продукта все, которые стыкуются как перебор.
Есть ли способ получить Только название продукта в первом запросе? Могу ли я установить какой-нибудь атрибут в DBML?
В этом стол говорит, что «значения внешнего ключа» являются «видимыми» в Linq To SQL, но не знает, что это означает.
Редактировать: Изменил заголовок, потому что не совсем уверен, что решения нет. Не могу поверить, что ни у кого нет такой проблемы, это очень распространенный сценарий.





Если вы выберете только нужные столбцы в запросе linq, а затем вызовете .ToList () в запросе, он будет немедленно выполнен и вернет только те столбцы, которые вам интересны. Например, если вы сделаете это:
var q = from p in dataContext.products select p.ProductName;
var results = q.ToList();
Вы получите обратно список названий продуктов, хранящихся в результатах, и когда запрос выполняется на сервере, он вернет только столбец ProductName.
Нет ... Обычно с linq, когда вы запускаете "var q = from c в db.Custs select c;" запрос не будет выполнен до тех пор, пока вы не выполните foreach по q. Это также обрушивает все клиентские поля. Если вы запустите q.ToList (), метод «ToList» выполнит переход по q и вставит результаты в список.
Также ... если вы измените поля в запросе, чтобы вы сделали "var q = (from c in db.Custs select c.CustID, c.CustName) .ToList ();" тогда база данных будет: 1) Выполнять запрос немедленно 2) Вывести только столбцы CustID и CustName.
Но я хочу вывести все поля заказа, а также название продукта (и имя клиента и т. д.). Как это связано с вопросом?
Вы сказали, что: 1) Вы не хотите использовать ленивую загрузку 2) У вас есть набор определенных столбцов, которые вы хотите отключить, и вы не хотите ничего, кроме этих столбцов. Запуск ToList () запускает запрос предварительное изменение списка выбора приводит к уменьшению именно того набора полей, который вы запрашиваете.
Вы просите об уровне оптимизации, который не обеспечивает linq-to-sql. Я думаю, что лучше всего создать запрос, который возвращает именно те данные, которые вы хотите, возможно, в виде анонимного типа:
from order in DB.GetTable<Orders>()
join product in DB.GetTable<Products>()
on order.ProductID = product.ID
select new { ID = order.ID, Name = order.Name, ProductName = product.Name };
Жить со всеми этими анонимными типами будет кошмаром.
@Eduardo: Напротив, в некоторых случаях (в частности, в этом типе случаев) анонимные типы действительно могут значительно упростить задачу.
Я получил решение в этом другом вопросе Какой .net ORM может справиться с этим сценарием, который связан с ответом Liammclennan, но более ясным (возможно, вопрос был более ясным)
Вы имеете в виду список для поиска, который ищет имя для каждой записи?