запрос linq из двух баз данных - PullRequest
2 голосов
/ 18 мая 2011

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

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>();
        }

Ответы [ 3 ]

2 голосов
/ 18 мая 2011

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

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

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

1 голос
/ 18 мая 2011

Вы можете использовать следующее для отображения сгенерированного 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 голосов
/ 18 мая 2011

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

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

Попробуйте создать отношения между 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,
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...