2010-04-09 32 views
1

想知道是否有一种方法可以将某些重排从LINQ to SQL投影类型中取出。LinqToSql:我如何创建投影来坚持DRY?

例子:

表:地址

领域: AddressID,HouseNumber,街道,城市,省,邮编,更+20

类MyAddress: AddressID,HouseNumber ,Street(Only 3 fields)

LINQ:

 
from a in db.Addresses 
select new MyAddress 
{ 
    AddressID = a.AddressID, 
    HouseNumber = a.HouseNumber, 
    Street = a.Street 
} 

上面的查询作品完美,我明白为什么这样的事情会返回各行中的所有20+领域:

 
from a in db.Addresses 
select new MyAddress(a); 

class MyAddress 
{ 
    public MyAddress(Address a) 
    { 
    this.AddressID = a.AddressID, 
    this.HouseNumber = a.HouseNumber, 
    this.Street = a.Street 
    } 
} 

这使我对我的问题:

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

+0

为什么你需要一个简化的数据类型? – 2010-04-09 12:44:39

+0

如果我正在使用一个有20-30-40个字段的表格,而我只需要/需要3个,为什么SQL要做这项工作并通过电线返回所有额外的数据? – Mike 2010-04-09 18:28:52

回答

2
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 
           }; 
} 
+0

看起来关键是IQueryable作为返回类型?单个地址如何?我有一个对象具有两个属性:OriginalAddress和CurrentAddress,这两个类型的地址。是否有可能创建一个帮助函数来接受“域模型”并吐出一个“视图模型”,我尝试的所有内容都将从数据库中提取整个记录。我是否试图重构太多? – Mike 2010-04-13 12:52:18

+0

使用IQueryable意味着linq将保留一个可以构建的表达式,稍后解析为查询并执行。我想我明白你想要达到的目标:将地址实体映射到地址视图模型中作为代码进行投影,并在另一个投影中多次使用该函数。是对的吗? – SteadyEddi 2010-04-13 13:41:49

+0

关键将使用动态linq并创建一个表示转换的表达式。恕我直言,我会说对于任何不熟悉构建表达式和元编程的人来说,结果代码都会很复杂。尽管如此,它肯定会增加DRY值。我会做出判断电话,并说如果我在很多地方重复了代码,并且更改该代码将花费大量时间,然后去做。 – SteadyEddi 2010-04-13 13:50:53