Построить объект из LINQ, используя те же поля другого запроса
Вот пример
SQL
create view v_join
as select m.* , d.oneDetail from master m, detail d
where m.key = d.key
LINQ
var view = from v in dc.v_join select new
{
Master = ???? /// that is an issue, how can I construct the objects using same fields but from another query,
Detail = v.oneDetail
};
foreach (var entry in view)
{
Master mEntry = entry.Master; // then we can use it, there are no problems
}
Эта ситуация встречается довольно часто и есть какой-то хитрый способ построить объект, используя те же поля, но из другого вида, и использует.
Когда я делаю такое соединение на стороне C#, я получаю низкую производительность, проблемы с отложенной загрузкой и т. Д. И в любом случае LINQ выдает много запросов для получения каждой подробной записи, это неприемлемо с точки зрения производительности.
Должно быть очевидное решение, я не могу поверить, что никто не сталкивался с такой же проблемой. Все очевидные решения, такие как dc.Translate, делают почти то же самое, но не совсем то, что мне нужно.
Помощь приветствуется.
5 ответов
Из m в dc.Мастер объединяет d в dc.Детали по m.Key = d.Key select new { m, d };
Попробуйте использовать DataLoadOptions и LoadWith, см. Http://dotnet.org.za/hiltong/archive/2008/02/12/lazy-loading-in-linq-loadwith-and-associatewith-dataloadoptions-part-1-loadwith . ASPX
Например
System.Data.Linq.DataLoadOptions dl = new System.Data.Linq.DataLoadOptions();
dl.LoadWith<Detail>( detail => detail.Master )
Это отвечает вашим потребностям?
Master = new Master() { Field1 = v.Field1, Field2 = v.Field2, Field3 = v.Field3 }
Вы не можете сделать это из v в dc.v_join, выбрав new { Master = new { Column1Name = v.masterColumn1, Column2Name = v.masterColumn2, ... }, Detail = v.oneDetail };?
Для меня это звучит странно. Причина, по которой вы используете представление, заключается в том, что у модели другое "представление", а не доступ к необработанной модели.
Я предлагаю вам присоединиться к таблице master-detail в LINQ, если вам это действительно нужно, вы можете избавиться от отложенной загрузки, используя опции loadWith. При правильной настройке, LINQ может выполнять загрузку, которая решает проблему производительности.