[英]linq query from two database
我有一个来自两个数据库的 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>();
}
你的 linq 语句看起来不错。 为了帮助调试,我发现将 linq 查询分配给局部变量,然后返回局部变量很有帮助。 然后,您可以在 return 语句上设置断点,当调试器在断点处停止时,您可以交互式地检查查询局部变量以查看其中的内容。 您可以使用 VS 中的 Locals 窗口或立即窗口浏览应用程序的变量并查看发生了什么。
特别是,仔细检查 linq 查询的输入是否确实提供了数据。 验证 RDdc.Brokernos 和 dc.Promotions 等是否为非空。如果这些为空,则结果将为空。 在“上游”跟踪您的错误。
小点:您不需要在选择中的 .ToList() 调用上指定类型参数。 编译器会自动推断类型。
您可以使用以下内容来显示为 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();
在我看来,double from 看起来很可疑。 (这不等同于 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,
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.