Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果数据来自两个不同的数据库,如何优化linq查询?_C#_Asp.net Mvc_Linq - Fatal编程技术网

C# 如果数据来自两个不同的数据库,如何优化linq查询?

C# 如果数据来自两个不同的数据库,如何优化linq查询?,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,小结:我必须显示当前日期到餐厅的访问列表。为此,我从数据库1查询了两个不同的数据库。我有两个表(TH_Order和GS_booking)和第二个数据库(CustomerFeedback) 我现在做的是 IEnumerable<ModelEngro.TH_Order> th_Order = _EntitiesEngro.TH_Order; IEnumerable<ModelEngro.GS_Booking> Booking = _EntitiesEngro.GS_Booki

小结:我必须显示当前日期到餐厅的访问列表。为此,我从数据库1查询了两个不同的数据库。我有两个表(TH_Order和GS_booking)和第二个数据库(CustomerFeedback) 我现在做的是

IEnumerable<ModelEngro.TH_Order> th_Order = _EntitiesEngro.TH_Order;
IEnumerable<ModelEngro.GS_Booking> Booking = _EntitiesEngro.GS_Booking.Where(x => x.Session_ID == NSession);
if (Dated != null)
    Booking = Booking.Where(x => x.Date.Date == Dated.ConvertToDate().Date);

IEnumerable<CustomerFeedback> CustomerFeedbacks = _EntitiesCRM.CustomerFeedbacks;

IEnumerable<ModelEngro.TH_Order> th_order = (from o in th_Order 
join b in Booking on o.Booking_id equals b.ID
join c in CustomerFeedbacks on o.Booking_id equals c.BookingID.ConvertToInt() into cFouter
from cf in cFouter.DefaultIfEmpty()
where cf == null
orderby b.Date descending
select new
{
     Booking_id = o.Booking_id,
     Bill_No = o.Bill_No,
     Sales_Tax = o.Sales_Tax,
     AdultOnTable = o.AdultOnTable,                                     
     ChildOnTable = o.ChildOnTable,
     Discount = o.Discount,
     Remarks = o.Remarks,
     ContectPerson = b.Contact_person
}).Select(x => new ModelEngro.TH_Order
{
     Booking_id = x.Booking_id,
     Bill_No = x.Bill_No,
     ales_Tax = x.Sales_Tax,
     AdultOnTable = x.AdultOnTable,
     ChildOnTable = x.ChildOnTable,
     Discount = x.Discount,
     Remarks = x.Remarks,
     ContectPerson = x.ContectPerson
});
IEnumerable th_Order=\u EntitiesEngro.th_Order;
IEnumerable Booking=\u EntitiesEngro.GS\u Booking.Where(x=>x.Session\u ID==n会话);
如果(日期!=null)
Booking=Booking.Where(x=>x.Date.Date==Dated.ConvertToDate().Date);
IEnumerable CustomerFeedbacks=\u EntitiesCRM.CustomerFeedbacks;
IEnumerable th_顺序=(从o到th_顺序
加入b在o上预订。预订id等于b.id
将c加入到CustomerFeedbacks中,将o.Booking_id等于c.BookingID.ConvertoInt()转换为cFouter
来自cFouter.DefaultIfEmpty()中的cf
其中cf==null
orderby b.日期递减
选择新的
{
预订id=o.预订id,
账单号=o.账单号,
销售税=营业税,
可调节的,
ChildOnTable=o.ChildOnTable,
折扣=o.折扣,
备注=o.备注,
ContectPerson=b.联系人
}).选择(x=>new ModelEngro.TH_订单
{
预订id=x.预订id,
账单号=x。账单号,
销售税=销售税,
可调节=x.可调节,
ChildOnTable=x.ChildOnTable,
折扣=x.折扣,
备注=x.备注,
ContectPerson=x.ContectPerson
});

所有这些表都至少有100K条记录,并且此查询在Application server上需要40-50秒。我想优化此查询。请提供任何帮助。

我建议通过存储过程在数据库级别执行计算,并将所需结果返回到解决方案。
让数据库服务器进行计算可以节省大量时间。

您有不同的选择

1.尝试使用存储过程

var result = context.Database
                .SqlQuery<type>("GetDataProc @param1", param1)
                .ToList();
对象,假定这是MSSQL

添加服务器对象后,需要创建查询远程服务器的本地视图。例如,假设SQL1是本地服务器,SQL2是远程服务器。在ManagementStudio中,在SQL1上,将链接服务器连接添加到SQL2。然后,您需要绕过实体框架的限制,它不直接支持链接服务器。从SQL1上的SQL2为您需要的每个数据集创建一个视图,然后使用EF以独占方式查询SQL1。SQL Server将在服务器端管理跨数据库和跨服务器查询。这比为所有跨服务器查询创建存储过程灵活得多。如果SQL2支持更改通知,那么视图还为您提供了被动缓存机制,从而大大减少了两台服务器之间的来回抖动。这完全绕过了EF的跨上下文查询限制

实体框架(在V6之前,我认为他们在6.1中增加了对同一上下文中多个数据库的支持)要求每个数据库有一个单独的上下文,这迫使需要两个上下文的查询都在本地实现,从而降低了性能。客户端必须分别查询两台服务器,然后合并结果。使用链接的服务器和视图,客户端查询第一台服务器,服务器在单个上下文下运行


如果两个数据库都在同一台服务器上,那么同样的策略也会起作用,只是没有链接的服务器。在第一个数据库中创建查询第二个数据库的视图。

我只需要获取当天的记录。我想这是codereview stackexchange网站的一个问题。他们建议如何改进你的工作代码。如果你的数据库在同一台服务器上,你可以构建一个数据库并从中获取数据。
CREATE INDEX index_name
ON table_name (column_name)