【问题标题】:Entity Framework 4.1 : How to do sub query in SelectEntity Framework 4.1:如何在 Select 中进行子查询
【发布时间】:2011-10-27 17:00:56
【问题描述】:

我正在尝试使用Entity Framework 4.1 Code First 进行以下操作:

Select c1,
       c2,
       (select v1 from table2 where id = c3) as col3
from table1

非常感谢任何帮助。

编辑:

例如,假设我在数据库中有两个表,

LookupValues [ID、代码、DescResourceID]

资源 [ResourceID、文化、价值]

DescResourceID 和 ResourceID 是外键。

所以我想为...创建一个配置或映射

public partial class LookupValues
{
  public virtual string ID;
  public virtual string Code;
  public virtual string Description;
}

如上所述,描述映射到subquery

【问题讨论】:

  • 如果你的代码不是那么“伪”并且脱离任何上下文,你的问题会更容易回答。您是否已经拥有 EF Code-First 模型并且您尝试过什么?你能用一个更具体的例子来证明这一点吗?
  • 是的,我确实有代码优先模型。为了简单起见,我在上面提到过。基本上我正在寻找为上述场景创建映射。或其他可能的解决方法。我目前的方式是将table2作为table1的子级。问题是,它为 table1 的每一行加载 table2 中的所有行,而我只需要 table2 的每一行或 table1 的一个值。让我知道这是否有意义,否则我将尝试将实际代码放在这里。我想这会有点混乱。感谢您的帮助。

标签: entity-framework linq-to-entities entity-framework-4.1 subquery


【解决方案1】:

你可以试试这样的:

var query = from x in context.Table1 
            let z = context.Table2
                           .Where(y => y.Id == c3)
                           .Select(y => y.V1).FirstOrDefault()
            select new
                {
                    C1 = x.C1,
                    C2 = x.C2,
                    C3 = z
                };

【讨论】:

  • 我们可以创建映射文件吗?例如,说 table2 是数据库中用于本地化的资源表。当上述场景映射到对象时,table1 具有从 table2 获取的 resourceId。因此,它不会进行两次往返,而是将正确的值映射到对象。
  • 在使用 EDMX 进行映射时,有一些有限的可能性,例如 DefiningQueryQueryView(= 在没有设计器的情况下使用 EDMX),但我不确定它是否完全符合您的要求。这些高级映射技术的结果也是只读的。
  • 是的,DefinedQuery 可能是一种可能的方式,但我们是 EF 4.1,使用不支持该功能的 Code First 方法。请参阅已编辑的原始帖子。谢谢。
  • 在这种情况下,您必须使用数据库视图。代码优先不适合高级映射场景。
【解决方案2】:

我会创建一个实体模型并使用 LINQ。

我假设您在使用实体框架时知道什么是 LINQ。

假设您有如下数据结构;

产品和产品有 (Column1, Column2, Column3) 类别和类别键具有与 Products.Column3 等效的 Column3

执行以下操作;

var categories_Column3 = List<Categories>().Select(c => c.Column3 == some value);
var products_Column3_Query = List<Products>().Select(c => c.Column3 == categories_Column3).ToList<value_type_of_column3>();

当然,这只是一些伪代码,因为我想确保你掌握 LINQ 的窍门,并意识到你可以使用实体框架在 LINQ 中做你想做的事情,因为它是 OR/M,我现在将向你指出以下站点,它应该为您提供有关 LINQ 的全面教程。

http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx

希望这会有所帮助!

编码愉快! ;)

【讨论】:

  • 感谢您的快速回复。是的,我熟悉 LINQ。但是上面的代码行并不能完全满足我的要求。我可以创建一个连接并将类别作为产品的子项,但在这种情况下,我将获取所有类别值而不是一个。我想根据 table1 中相应行中的值从 table2 中获取一个值。另外,我使用的是实体框架 4.1 代码优先方法。
猜你喜欢
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多