2011-05-18 157 views
2

我有一个来自两个数据库的linq查询,但每次程序停在查询点时。我不知道如何使用VS调试linq。有人能帮我弄清楚这里有什么问题吗?谢谢。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-entities) – 2011-05-18 18:21:28

+1

linq to entities – 2011-05-18 18:23:40

回答

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

注销表示'System.InvalidOperationException',但我在这里看不到任何语法错误。 – 2011-05-18 18:15:38

+0

您能否确认您可以使用SQL从两个数据库中进行选择?在SQL中,您将执行三部分查询(database.schema。表)在一个数据库中执行。不确定Linq会做什么。您可以尝试在Edit中添加上面的内容。 – Leons 2011-05-18 18:46:25

+0

@Leons我试过你的代码,它出现了一个错误“查询包含对在不同数据上下文中定义的项目的引用”。任何想法? – 2011-05-18 19:02:43

2

您的linq语句看起来不错。为了帮助调试,我发现将linq查询分配给局部变量很有帮助,然后返回局部变量。然后,您可以在return语句中设置一个断点,并且当调试器在断点处停止时,您可以交互式地查看查询局部变量以查看其中的内容。您可以使用VS中的Locals窗口或立即窗口浏览应用程序变量的内容并查看发生了什么。

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

小问题:您不需要在select中的.ToList()调用中指定类型参数。编译器将自动推断该类型。

0

从我怀疑可疑的双。 (这不是SQL的JOIN语句,如果这是你瞄准的等价物。)

如果能结合上下文:

尝试建立在EDMX BrokerNos和促销之间的关系,并使用导航属性在查询中。

例如:

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

都是dataContexts到同一个数据库服务器实例吗? - 如果是这样,也许创建一个使用它们并集成它们的edmx。然后打开它的上下文。请参阅此链接:http://blogs.msdn.com/b/adonet/archive/2008/11/25/working-with-large-models-in-entity-framework-part-1.aspx – 2011-05-18 18:35:52

+0

BrokerName必须是从另一个数据库表跟踪BrokerNo.Name – 2011-05-18 18:37:10

+0

是的,相同的数据库服务器但数据库不同。 – 2011-05-18 18:38:35