C# LINQ到SQL两种上下文
我试图从两个不同的数据库获取数据以检索数据,然而;我得到这个错误C# LINQ到SQL两种上下文,c#,linq,C#,Linq,我试图从两个不同的数据库获取数据以检索数据,然而;我得到这个错误 **The query contains references to items defined on a different data context** db = context1 db2 = context2 var query = from m in db.Merch join d in db.Dept on m.merchDept equals d.deptID
**The query contains references to items defined on a different data context**
db = context1
db2 = context2
var query = from m in db.Merch
join d in db.Dept on m.merchDept equals d.deptID.ToString()
join p in db2.PROD_SKU on m.pID equals p.pID
join f in db.FOB on d.fobCode equals f.fobID
join w in db.Item on m.merchID equals w.merchID
join i in db.Doc on m.merchID equals i.MerchID
where p.UPC_NBR.ToString() == upc
我将如何使用这两个上下文使用linq检索该记录。任何帮助都将不胜感激 简而言之,你不能。。。不容易。 为了进行跨数据库连接,必须使用一个引用两个数据库的数据上下文
<Table Name="db.dbo.Merch" Member="Merch">
...
</Table>
<Table Name="db2.dbo.PROD_SKU" Member="PROD_SKU">
...
</Table>
...
...
在DBML中,手动更改表的名称,使其看起来与上面的类似。您还必须确保设置了允许查询这两个数据库的权限。简单的回答是您不能。。。不容易。
<Table Name="db.dbo.Merch" Member="Merch">
...
</Table>
<Table Name="db2.dbo.PROD_SKU" Member="PROD_SKU">
...
</Table>
为了进行跨数据库连接,必须使用一个引用两个数据库的数据上下文
<Table Name="db.dbo.Merch" Member="Merch">
...
</Table>
<Table Name="db2.dbo.PROD_SKU" Member="PROD_SKU">
...
</Table>
...
...
在DBML中,手动更改表的名称,使其看起来与上面的类似。您还必须确保已设置允许查询两个数据库的权限。Linq2Sql不支持对多个数据库上下文的查询。但是,您的示例看起来非常简单—通过upc查找p.pID,然后在第二个查询中将该值用作参数。
<Table Name="db.dbo.Merch" Member="Merch">
...
</Table>
<Table Name="db2.dbo.PROD_SKU" Member="PROD_SKU">
...
</Table>
可能是这样的:
db = context1
db2 = context2
var upcId = (from p in db2.PROD_SKU
where p.UPC_NBR.ToString() == upc
select p.pID).Single();
var query = from m in db.Merch
join d in db.Dept on m.merchDept equals d.deptID.ToString()
join f in db.FOB on d.fobCode equals f.fobID
join w in db.Item on m.merchID equals w.merchID
join i in db.Doc on m.merchID equals i.MerchID
where m.pID == upcId;
Linq2Sql不支持对多个数据库上下文的查询。但是,您的示例看起来非常简单—通过upc查找p.pID,然后在第二个查询中将该值用作参数。 可能是这样的:
db = context1
db2 = context2
var upcId = (from p in db2.PROD_SKU
where p.UPC_NBR.ToString() == upc
select p.pID).Single();
var query = from m in db.Merch
join d in db.Dept on m.merchDept equals d.deptID.ToString()
join f in db.FOB on d.fobCode equals f.fobID
join w in db.Item on m.merchID equals w.merchID
join i in db.Doc on m.merchID equals i.MerchID
where m.pID == upcId;
对于更复杂的场景,还可以执行两个LINQ查询并连接结果。在这里,我获取了sales quotes状态更新的历史记录,并将它们与另一个数据库中包含更新用户名的表连接起来,以便在ItemsControl中显示它们:
var firstResults = (from qsl in firstContext.QuoteStatusLogs
join qs in firstContext.QuoteStatus
on qsl.QuoteStatusID equals (qs.QuoteStatusID)
where qsl.QuoteID == quoteID
select new
{
HistoryEvent = qsl.UpdateTime,
QuoteStatus = qs.Description,
UserGUID = qsl.EmployeeGUID,
Comment = qsl.Comment
}).ToList();
var finalResults = (from r1 in firstResults
join e in secondContext.Employees
on r1.UserGUID equals (e.UserID)
orderby r1.HistoryEvent descending
select new QuoteStatusHistoryResult
{
HistoryEvent = r1.HistoryEvent,
QuoteStatus = r1.QuoteStatus,
User = e.FirstName + " " + e.LastName,
Comment = r1.Comment
}).ToList();
statusHistory = new ObservableCollection<QuoteStatusHistoryResult>(finalResults);
var firstResults=(来自firstContext.QuoteStatusLogs中的qsl
在firstContext.QuoteStatus中加入qs
关于qsl.QuoteStatusID等于(qs.QuoteStatusID)
其中qsl.QuoteID==QuoteID
选择新的
{
HistoryEvent=qsl.UpdateTime,
QuoteStatus=qs.说明,
UserGUID=qsl.EmployeeGUID,
Comment=qsl.Comment
}).ToList();
var finalResults=(来自firstResults中的r1
在secondContext.Employees中加入e
在r1上,UserGUID等于(e.UserID)
orderby r1.HistoryEvent降序
选择新QuoteStatusHistoryResult
{
HistoryEvent=r1.HistoryEvent,
QuoteStatus=r1.QuoteStatus,
User=e.FirstName+“”+e.LastName,
注释=r1。注释
}).ToList();
statusHistory=新的ObservableCollection(最终结果);
第一个“ToList”调用很重要,因为如果没有它,我会遇到一个异常,说我试图从两个上下文进行查询。对于更复杂的场景,您还可以执行两个LINQ查询并合并结果。在这里,我获取了sales quotes状态更新的历史记录,并将它们与另一个数据库中包含更新用户名的表连接起来,以便在ItemsControl中显示它们:
var firstResults = (from qsl in firstContext.QuoteStatusLogs
join qs in firstContext.QuoteStatus
on qsl.QuoteStatusID equals (qs.QuoteStatusID)
where qsl.QuoteID == quoteID
select new
{
HistoryEvent = qsl.UpdateTime,
QuoteStatus = qs.Description,
UserGUID = qsl.EmployeeGUID,
Comment = qsl.Comment
}).ToList();
var finalResults = (from r1 in firstResults
join e in secondContext.Employees
on r1.UserGUID equals (e.UserID)
orderby r1.HistoryEvent descending
select new QuoteStatusHistoryResult
{
HistoryEvent = r1.HistoryEvent,
QuoteStatus = r1.QuoteStatus,
User = e.FirstName + " " + e.LastName,
Comment = r1.Comment
}).ToList();
statusHistory = new ObservableCollection<QuoteStatusHistoryResult>(finalResults);
var firstResults=(来自firstContext.QuoteStatusLogs中的qsl
在firstContext.QuoteStatus中加入qs
关于qsl.QuoteStatusID等于(qs.QuoteStatusID)
其中qsl.QuoteID==QuoteID
选择新的
{
HistoryEvent=qsl.UpdateTime,
QuoteStatus=qs.说明,
UserGUID=qsl.EmployeeGUID,
Comment=qsl.Comment
}).ToList();
var finalResults=(来自firstResults中的r1
在secondContext.Employees中加入e
在r1上,UserGUID等于(e.UserID)
orderby r1.HistoryEvent降序
选择新QuoteStatusHistoryResult
{
HistoryEvent=r1.HistoryEvent,
QuoteStatus=r1.QuoteStatus,
User=e.FirstName+“”+e.LastName,
注释=r1。注释
}).ToList();
statusHistory=新的ObservableCollection(最终结果);
第一个“ToList”调用很重要,因为如果没有它,我会遇到一个异常,说我试图从两个上下文进行查询。在pID之外,db2中还有一些字段,我需要在第一个查询中获取并将其存储在某个类的实例中(可能是匿名的):选择new{pID=p.pID,SomeProperty=p.SomeProperty}非常感谢您的帮助。在pID之外,db2中还有一些字段,我需要在第一个查询中获取这些字段,并将其存储在某个类的实例中(可以是匿名的):选择new{pID=p.pID,SomeProperty=p.SomeProperty}等等。非常感谢您的帮助。您需要查看您的数据设置。您需要查看您的数据设置。