[英]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.