【问题标题】:Entity Framework Optionally Mapped Column实体框架可选映射列
【发布时间】:2017-10-23 23:38:54
【问题描述】:

是否有一种简单的方法来处理仅在某些时候映射的属性?例如:

我有一个产品表和产品实体。大多数时候我使用 LINQ to SQL 来执行相当于:

select * from products where...

但是,偶尔,我手动编写的 SQL 查询更像:

select products.*, someOtherVal, anotherVal from products join....

据我所知,我无法将someOtherValanotherVal 添加到我的实体中,因为它们并不总是映射到列。

注意:我意识到正确设置我的所有实体和关系而不使用 Entity.SqlQuery() 可能会更好。我只是想知道是否有一种快速的方法可以实现我现在的目标。稍后我会在继续将我的应用程序转换为 EF 时进行改进。

【问题讨论】:

  • 你在寻找类似this的东西
  • 不,连接不是问题。我需要一种方法来处理有时只包含在结果集中的列的映射。
  • 不,这不可能,所以最好按照你现在提到的方式开始。当然,您可以创建和使用单独的非实体类(又名 DTO)并使用 DbContext.Database.SqlQuery<T> 方法将其投影到其中。
  • @IvanStoev 好的,感谢您的信息!

标签: c# vb.net entity-framework linq


【解决方案1】:

使用匿名类型。

您创建的 IQueryable 变量在您对其进行枚举之前不会执行。如果您的 IQueryable 中的表达式仅使用您产品的某些属性,那么您的查询中只会请求这些属性:

var myQuery = mydbContext.Products           // join products and OtherTable
   .Join(myDbContext.OtherTable,
       product => product.SomeForeignKey,    // from product use SomeForeignKey
       otherThing => otherThing,PrimaryKey,  // from otherTable use PrimaryKey
       (product, otherThing) => new          // when these key Match
       {                                     // create an anonymous object
           X = product.X,                    // with the Properties you want
           Y = product.Y,           
           Z = otherThing.Z,
       };

注意:查询仍未执行。 现在,如果您执行查询,例如由于 ToList(),则在您的 SQL 中仅选择请求的参数

var result = myQuery.ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 2014-11-17
    • 2021-06-01
    • 2016-02-21
    • 2017-02-11
    • 2011-03-09
    • 2014-04-01
    • 1970-01-01
    相关资源
    最近更新 更多