ADO.NET实体框架 - 如何仅从一个表中选择数据(并忽略其他表)?

时间:2011-03-15 03:47:06

标签: entity-framework linq-to-entities ado.net-entity-data-model

背景是我刚刚开始使用EntityFramework的团队;首先我们设计数据库,把所有的表关系放在适当的位置,外键等;然后通过visual studio添加一个新的ADO.NET实体数据模型,并自动神奇地获取生成的edmx文件代表整个数据库!

现在我专注于两个为所有下拉列表和查找列表提供数据的表格;

TLookupDomain (domainID, domainName, domainDesc )

TLookup (lookupID, domainID, lookupCode, lookupDisplay, lookupDesc, sortOrder)

关系是从左到右的1-M:

TLookupDomain - < TLookup - < TOther(+另外30个左右的其他表)

因此,lookupID是多达30个表的外键;

IQueryable<TLookup> qList = from l in ctx.TLookups
                            where l.domainID == 24
                            select l;
foreach (TLookup l in qList)
{
   //do something.
   System.Diagnostics.Debug.WriteLine("{0}\t{1}", l.lookupCode, l.lookupDisplay);
   foreach (TOther f in l.TOthers)
   {
      System.Diagnostics.Debug.WriteLine("{0}\t{1}", f.feeAmount, f.feeDesc);
   }
}

当我执行上面的LINQ时,我得到了TLookup表的所有字段(这是公平的),但是也为30个左右的链表提取了数据,即使我对其他表不感兴趣此时表格的数据,我将尽快丢弃所有数据,因为LINQ取出它。

我有两个问题: Q.1)我可以以某种方式修改上面的LINQ查询或告诉EntityFramework否则不要打扰来自其他30个链表的fetchin数据吗?

Q.2)拥有一个模拟整个数据库的edmx文件是“正确的”吗? (听起来很狡猾)。

2 个答案:

答案 0 :(得分:1)

为模型配置Lazy Load为true。关系应该只在navegation上加载。您还可以拆分模型以避免太多不必要的关系。

答案 1 :(得分:1)

Linq-to-Entities查询不会自动获取任何内容。通过急切或延迟加载来获取导航属性。您没有使用预先加载,因为这需要在查询中调用Include(或单独ctx.LoadProperty)。因此,如果您的数据被提取,则必须归因于默认情况下启用的延迟加载。一旦访问代码中的导航属性,就会触发延迟加载。

您还可以使用投影返回所需的数据。像这样的东西应该返回只读数据:

var query = from l in ctx.TLookups
            where l.domainId == 24
            select new 
              {
                l.lookupCode,
                l.lookupDisplay,
                l.TOthers
              };

拥有一个或多个EDMX是常见的两难选择。使用单个EDMX可以使事情变得更简单。如果您想知道如何使用多个EDMX并共享概念定义,请查看以下两篇文章:Part 1Part 2