来自两个数据库的linq查询

时间:2011-05-18 17:33:09

标签: c# linq entity-framework linq-to-entities

但是,每次程序在查询点停止时,我都会从两个数据库中获得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>();
        }

3 个答案:

答案 0 :(得分:2)

你的linq声明看起来很好。为了帮助调试,我发现将linq查询分配给局部变量,然后返回局部变量很有帮助。然后,您可以在return语句上设置断点,并且当调试器在断点处停止时,您可以交互式地检查查询局部变量以查看其中的内容。您可以使用VS中的“本地”窗口或“立即窗口”在应用程序变量内部浏览并查看正在进行的操作。

特别是,仔细检查linq查询中的输入是否实际提供数据。验证RDdc.Brokernos是否为非空,以及dc.Promotions等。如果这些为空,则结果为空。跟踪你的错误“上游”。

次要要点:您无需在select中的.ToList()调用上指定type参数。编译器将自动推断出类型。

答案 1 :(得分:1)

您可以使用以下内容显示Linq语句生成的SQL。

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

答案 2 :(得分:0)

双重看起来对我很可疑。 (这不等同于SQL的JOIN语句,如果这是你的目标。)

如果你可以结合上下文:

尝试在edmx中创建BrokerNos和Promotions之间的关系,并在查询中使用导航属性。

例如:

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

如果没有(交叉将在内存中完成,而不是在DB !!!:

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