【问题标题】:LinqToSql: How can I create a projection to adhere to DRY?Linq To Sql:如何创建一个符合 DRY 的投影?
【发布时间】:2010-04-09 12:42:21
【问题描述】:

只是想知道是否有办法从 LINQ to SQL 投影类型中提取一些重复。

例子:

表格:地址

字段:AddressID、HouseNumber、Street、City、State、Zip 等 20 多个

Class MyAddress: AddressID、HouseNumber、Street(只有 3 个字段)

LINQ:

从 db.Addresses 中的 选择新的我的地址 { AddressID = a.AddressID, HouseNumber = a.HouseNumber, 街道 = a.Street }

上述查询完美运行,我明白为什么这样的事情会返回每行中的所有 20 多个字段:

从 db.Addresses 中的 选择新的我的地址(a); 我的地址类 { 公共我的地址(地址 a) { this.AddressID = a.AddressID, this.HouseNumber = a.HouseNumber, this.Street = a.Street } }

这让我想到了我的问题:

是否有可能实现某种辅助函数或扩展方法来从 LINQ 模型“映射”到 MyAddress,但只返回查询结果中的必要字段而不是所有字段?

【问题讨论】:

  • 为什么需要简化数据类型?
  • 如果我正在使用一个包含 20-30-40 个字段的表,而我只需要/想要 3 个字段,为什么 SQL 会完成这项工作并通过网络返回所有额外的数据?跨度>

标签: linq-to-sql projection


【解决方案1】:
from a in db.Addresses
select new MyAddress
{
  AddressID = a.AddressID,
  HouseNumber = a.HouseNumber,
  Street = a.Street
}

该查询将只选择结果 SQL 中的请求字段。

重用类型的函数如下所示:

public IQueryable<MyAddress> ProjectAddress(IQueryable<Address> addresses)
{
    return from a in addresses
           select new MyAddress
           {
               AddressID = a.AddressID,
               HouseNumber = a.HouseNumber,
               Street = a.Street
           };
}

可以这样使用:

return ProjectAddress(db.Addresses);

我认为函数看起来像:

public static Expression<Func<Address, MyAddress>> ToMyAddress()
{
    return a => new MyAddress { AddressID = a.AddressID, 
                                HouseNumber = a.HouseNumber,
                                Street = a.Street
                              };
}

【讨论】:

  • 看来关键是 IQueryable 作为返回类型?一个地址怎么样?我有一个具有两个属性的对象:OriginalAddress 和 CurrentAddress,两者都是地址类型。是否可以创建一个辅助函数来接受“域模型”并吐出一个“视图模型”,我尝试的一切最终都会从数据库中提取整个记录。我是否试图重构太多?
  • 使用 IQueryable 意味着 linq 将保留一个可以构建的表达式,稍后将其解析为查询并执行。我想我理解您要实现的目标:将地址实体的投影表示为地址视图模型作为代码,并在另一个投影中多次使用它,就像函数调用一样。对吗?
  • 关键是使用动态 linq 并创建一个表示转换的表达式。恕我直言,对于不熟悉构建表达式和元编程的人来说,生成的代码看起来会非常复杂。不过,它肯定会增加 DRY 值。我会做出判断,如果我在很多地方重复代码,并且更改该代码将花费大量时间,那么就去做吧。
  • 我对答案进行了编辑。你觉得这一步太过分了吗?
猜你喜欢
  • 2010-10-27
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多