Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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# 具有子查询和LET的Linq性能_C#_Sql_Linq_Entity Framework_Linqpad - Fatal编程技术网

C# 具有子查询和LET的Linq性能

C# 具有子查询和LET的Linq性能,c#,sql,linq,entity-framework,linqpad,C#,Sql,Linq,Entity Framework,Linqpad,我在LinqPad(针对SQL2010后端的EF4)中执行一个查询,它使用导航属性访问相关表。我真的无法处理索引等等,我想知道是否有任何方法可以避免查询底部那些“firstordefault”项中固有的所有子查询。我尝试在顶部使用“let accounts=I.ExpenseItemAccountings.FirstOrDefault()”语句,然后使用该引用使其仅运行一个子查询,但对于任何有意义的记录数,运行此查询仍然需要一个多小时的时间 我有什么办法可以提高效率吗 var outpu

我在LinqPad(针对SQL2010后端的EF4)中执行一个查询,它使用导航属性访问相关表。我真的无法处理索引等等,我想知道是否有任何方法可以避免查询底部那些“firstordefault”项中固有的所有子查询。我尝试在顶部使用“let accounts=I.ExpenseItemAccountings.FirstOrDefault()”语句,然后使用该引用使其仅运行一个子查询,但对于任何有意义的记录数,运行此查询仍然需要一个多小时的时间

我有什么办法可以提高效率吗

    var output = from i in ExpenseItems where
i.Er_Approved_Date >= fromDate &&
i.Er_Approved_Date <= toDate
select new {ER_Num = i.ErNum,
         Line_Num = i.ItemNum,
         Report_Title = i.Report_Title,
         Requestor = i.Requester_Name,
         Preparer = i.Preparer_Name,
         ER_Total_Value = i.Er_TotalVal,
         Partition = i.Org,
         Transaction_Date = i.Item_Transaction_Date,
         Approved_Date = i.Er_Approved_Date,
         Item_Amount = i.Item_Amount,
         Tips = i.Item_Tips,
         GST = i.Item_Gst,
         Have_Receipt = i.Item_Have_ReceiptTf,
         Have_Invoice = i.Item_Have_InvoiceTf,
         Vendor = i.Item_Vendor,
         City = i.Item_City,
         Item_Expense_Type = i.Item_Expense_Type,
         Item_Description = i.Item_Expense_Description,
         Misc_Item_Commodity = i.Item_Misc_Commodity_Name,
         Misc_Item_SubCategory = i.Item_Misc_Specify,
         Misc_Item_OtherMisc_Description = i.Item_Misc_Specify_Other_Desc,
         Entity_Num = i.ExpenseItemAccountings.FirstOrDefault().Item_Entity_Num,
         Entity_Name = i.ExpenseItemAccountings.FirstOrDefault().Item_Entity_Name,
         Account_Num = i.ExpenseItemAccountings.FirstOrDefault().Item_Account_Num,
         Account_Desc = i.ExpenseItemAccountings.FirstOrDefault().Item_Account_Name,
         SubAccount_Num = i.ExpenseItemAccountings.FirstOrDefault().Item_SubAccount_Num,
         SubAccount_Name = i.ExpenseItemAccountings.FirstOrDefault().Item_SubAccount_Name,
         CostCentre_Num = i.ExpenseItemAccountings.FirstOrDefault().Item_CostCentre_Num,
         CostCentre_Name = i.ExpenseItemAccountings.FirstOrDefault().Item_CostCentre_Name,
         Project_Code = i.ExpenseItemAccountings.FirstOrDefault().Expense_Item_ProjectCode,
         ////Percent_Allocated = i.ExpenseItemAccountings.FirstOrDefault().Item_Percent,
         ER_Comments = i.Er_Comments,
         Item_First_Comment = i.ExpenseItemComments.FirstOrDefault().Comment_Content,
         Violations = i.ExpenseItemViolations.Count()
                      };
var输出=支出项目中的i,其中
i、 Er\U批准日期>=起始日期&&

i、 在LinqPad上,您应该能够查看从LINQ语句生成的SQL语句

在我看来,在LINQtoEntities(或LINQtoSQL)中使用
let
或导航属性一直存在争议。有时,一个简单的
JOIN
也可能更有效。换句话说,这完全取决于LINQ提供者(实体框架)如何将特定查询优化为SQL语句

我建议您使用all
let/join/navigation
测试您的查询,以查看生成的SQL语句

您可以在代码中使用
System.Data.Objects
下的
ObjectQuery
,以便在没有SQL探查器或intellitrace工具的情况下查看实时SQL语句:

((ObjectQuery)anyLinqQuery).ToTraceString();
您还可以尝试使用多个
from
子句:

var output = from i in ExpenseItems
             from exp in i.ExpenseItemAccountings
             where ....
             select new {...};


这种类型的查询不适合Linq,您可能需要直接使用行号之类的东西执行TSQL命令。这种查询的最大缺点是它返回所有ExpenseItemAccountings,而不是每个ExpenseItem返回第一个ExpenseItemAccountings。
var output = from i in ExpenseItems
             from exp in i.ExpenseItemAccountings.DefaultIfEmpty()
             where ....
             select new {...};