1

我正在尝试在实体框架中执行一个简单的查询。

我有一个时髦的东西清单

List<FunkyThing> funkyThings;

其中有 1-5 个 unique FunkyThing

FunkyThing
{
   string FunkyThingUniqueCustomerCode{get;set}
   string UsefullInfoRegardFunkyThings{get;set}
}

我正在尝试加入我数据库中的时髦事物表。

该表看起来类似于:

FunkyThingsTable

int ID
string UniqueCustomerCode 
string colour
string usefulInfoOfGreatValue
decimal cost

现在,这个表中大约有 300,000 个时髦的东西。

我希望做的是将我的列表加入我的表中,以获取有用的InfoOfGreatValue 元素。如下:

var listOfFunkyThingsUsefulInfoQuery = from funkyThing in funkyThings
                                   join
                                      funkyThingDBEntity in unitOfWork.FunkyThingsRepository.Get()
                                      on funkyThing.FunkyThingUniqueCustomerCode equals funkyThingDBEntity .UniqueCustomerCode

                                  select new
                                  {
                                      uniqueCode= funkyThingDBEntity .UniqueCustomerCode,
                                      usefulInfoOfGreatValue= funkyThingDBEntity .usefulInfoOfGreatValue
                                  };

不幸的是,查询运行大约需要 5 秒——即使列表中只有一项。我究竟做错了什么?

一些快速的笔记。我正在使用此处描述的工作单元模式: http ://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of -work-patterns-in-an-asp-net-mvc-application

由于长期技术原因,客户没有整数 ID,只有字符串客户代码 - 因此进行了比较。

附加说明:根据工作单元文章 unitOfWork.FunkyThingsRepository.Get() 返回一个 IEnumerable:

 public virtual IEnumerable<TEntity> Get

我刚刚尝试过重新工作,所以使用 lambda 如下:

var listOfFunkyThingsUsefulInfoQuery = unitOfWork.FunkyThingsRepository.Get().Join (funkyThings, funkyThingDBEntity=>funkyThingDBEntity.UniqueCustomerCode, funkyThings=>funkyThings.FunkyThingUniqueCustomerCode ,(funkyThings,funkyThingDBEntity)=>new {uniqueCode= funkyThingDBEntity .UniqueCustomerCode, usefulInfoOfGreatValue=funkyThingDBEntity .usefulInfoOfGreatValue}) ; 

然而遗憾的是,这需要相同的时间

4

2 回答 2

3

您的查询将导致所有 300,000 行从数据库中检索到内存并在那里执行连接。查看您的查询,您要做的就是提取UsefulInfoOfGreatValuefunkyThings基于UniqueCustomerCode.

在文章中,该Get()方法有一个默认为 null 的过滤器参数。您可以设置此过滤器以使您的查询更快(即只获取您需要的行)

尝试这个

var funkyThingsCustomerCodes = funkyThings.Select(x => x.FunkyThingUniqueCustomerCode).ToList();

var listOfFunkyThingsUsefulInfoQuery =
      from funkyThing in unitOfWork.FunkyThingsRepository.Get(e => funkyThingsCustomerCodes.Contains(e.UniqueCustomerCode))
      select new {
        UniqueCode = funkyThing.UniqueCustomerCode,
        UsefulInfoOfGreatValue = funkyThing.UsefulInfoOfGreatValue
      };

此外,如果您在表中的列上创建索引,UniqueCustomerCode则上述查询会更快。

于 2013-06-01T18:19:41.890 回答
0

尝试使用急切加载,并使用 include 语句。它会快一点。请通过以下链接,它可能对您有所帮助。

http://msdn.microsoft.com/en-us/data/jj574232.aspx http://blogs.msdn.com/b/adonet/archive/2008/10/07/migrating-from-linq-to-sql -to-entity-framework-eager-loading.aspx

于 2013-06-01T19:03:34.170 回答