2011-05-18 2 views
2

У меня есть запрос linq из двух баз данных, однако каждый раз, когда программа останавливается в точке запроса. Я не знаю, как отлаживать linq с помощью VS. Может кто-нибудь помочь мне понять, что здесь не так? Спасибо.запрос linq из двух баз данных

public List<Promotion> GetBroder(string source) 
     { 
      string _connString = ConfigurationManager.AppSettings["DB1"]; 
      PromotionDataContext dc = new PromotionDataContext(_connString); 
      string connString = ConfigurationManager.AppSettings["DB2"]; 
      ReachDirectDataContext RDdc = new ReachDirectDataContext(connString); 
      return (from b in RDdc.BrokerNos 
        from p in dc.Promotions 
        where p.Source == source && p.Broker == b.BrokerNo1 
        select new Promotion() {Code=p.Code,BrokerName=b.Name}).ToList<Promotion>(); 
     } 
+0

Какие технологии доступа к данным вы используете (например? EF + Linq-to-entity) –

+1

linq для сущностей –

ответ

1

Для отображения сгенерированного SQL для оператора Linq вы можете использовать следующее.

ReachDirectDataContext RDdc = new ReachDirectDataContext(connString); 

RDdc.Log = Console.Out; 

return (from b in RDdc.BrokerNos 
     from p in dc.Promotions  
     where p.Source == source && p.Broker == b.BrokerNo1 
     select new Promotion() {Code=p.Code,BrokerName=b.Name}).ToList<Promotion>(); 

Вы можете попробовать следующее, чтобы разделить запросы.

var promotions = from p in dc.Promotions 
       where p.Source == source 
       select p; 

var brokers = from o in promotions 
       join b in RDdc.BrokerNos on o.Broker equals b.BrokerNo1 
       select new Promotion 
       { 
        Code = o.Code, 
        BrokerName = b.Name 
       }; 
return brokers.ToList(); 
+0

Выход из системы сказал «System.InvalidOperationException», но здесь я не вижу никакой синтаксической ошибки. –

+0

Можете ли вы подтвердить, что вы можете выбрать из обеих баз данных с SQL? В SQL вы будете делать запрос из трех частей (database.schema. table), выполненных в одной базе данных. Не уверен, что сделает Linq. Вы можете попробовать, что я добавлю выше в Edit. – Leons

+0

@Leons Я попробовал ваш код, он выходит с ошибкой «Запрос содержит ссылки на элементы, определенные в другом контексте данных». Есть идеи? –

2

Ваше заявление linq отлично выглядит. Чтобы помочь в отладке, я считаю полезным назначить запрос linq локальной переменной, а затем вернуть локальную переменную. Затем вы можете установить точку останова в операторе return, а когда отладчик остановится в точке останова, вы можете проверить локальную переменную запроса, чтобы увидеть, что в ней, в интерактивном режиме. Вы можете использовать окно Locals в VS или Immediate Window для просмотра внутри переменных вашего приложения и посмотреть, что происходит.

В частности, дважды проверьте, что входы в ваш запрос linq фактически предоставляют данные. Убедитесь, что RDdc.Brokernos не пуст, и dc.Promotions и т. Д. Если они пустые, результат будет пустым. Отслеживайте свою ошибку «вверх по течению».

Незначительная точка: вам не нужно указывать параметр типа в вызове .ToList() в элементе выбора. Компилятор автоматически выводит тип.

0

Двойной взгляд выглядит подозрительно для меня. (Это не эквивалентно SQL присоединимся заявление, если это то, что вы стремитесь.)

Если вы можете объединить контексты:

Попробуйте создать связь между BrokerNos и Promotions в EDMX и используя свойство навигации в запросе.

Например:

var result = dc.Promotions.Where(p => p.Source == source). 
    Select(p => new Promotion() { 
     Code = p.Code, 
     BrokerName = p.Broker.Name, // use new navigation property here 
    }); 

Если нет (пересечение будет сделано в памяти, а не на БД !!!:

var result1 = dc.Promotions.Where(p => p.Source == source). 
    Select(p => new Promotion() { 
     Code = p.Code, 
     BrokerId = p.BrokerId, // add id property for intermediate results 
    }).ToList(); 

var result2 = RDdc.Brokers.ToList(); 

var finalResult = result1.Where(p => result2.Contains(b => b.BrokerId == p.BrokerId)).Select(p => new Promotion{ 
     Code = p.Code, 
     BrokerName = result2.Single(b => b.BrokerId == p.BrokerId).Name, 
    }); 
+0

Являются ли оба экземпляра dataContext для одного экземпляра сервера базы данных? - Если это так, возможно, создайте edmx, который использует их оба и интегрирует их. Затем откройте контекст. См. Эту ссылку: http://blogs.msdn.com/b/adonet/archive/2008/11/25/working-with-large-models-in-entity-framework-part-1.aspx –

+0

Имя брокера должно быть прослеживается из другой таблицы базы данных BrokerNo.Name –

+0

Да, тот же сервер базы данных, но другая база данных. –

Смежные вопросы