重构Linq到SQL选择表达式

时间:2016-09-02 14:30:36

标签: c# linq

我有一个带有非常冗长的选择列表的Linq to SQL语句

List<MyClass> myClasses = (from table1 in context.Table1
                          join table2 in context.Table2
                          on table1.Key equals table2.Key
                          join table3 in context.Table3
                          on table1.FK equals table3.Key
                          select new MyClass()
                          {
                            propertyA = table1.Key

                            // plus about 50 other property setters
                          }).Distinct().ToList();

我正在试图弄清楚如何将select new MyClass() {}表达式中的属性setter重构为更可用/可读的东西。我已经创建了其他类用来映射相同属性的映射,所以我希望能够利用我现有的方法。像

这样的东西
select new MyClass() 
{
    // Existing mapping method
    MapProperties()
}

这可能吗?原因是我被要求不写SQL。使用SQL可以使一切变得更加容易。

3 个答案:

答案 0 :(得分:0)

如果您要从相同的课程(MyClassTable1Table2)创建Table3,则可以创建Expression<Func<CustomTable123, MyClass>>进行翻译为了你。

设置中间容器

public class CustomTable123
{
  public Table1 Table1 { get; set; }
  public Table2 Table2 { get; set; }
  public Table3 Table3 { get; set; }

创建翻译表达式

public static Expression<Func<CustomTable123, MyClass>> TranslateExp = 
  x => new MyClass
  {
    propertyA = x.Table1.Key,
    ...
  } 
}

将您的查询更改为项目到新容器

var query = from table1 in context.Table1
            join table2 in context.Table2 on table1.Key equals table2.Key
            join table3 in context.Table3 on table1.FK equals table3.Key
            select new CustomTable123
            {
              Table1 = table1,
              Table2 = table2,
              Table3 = table3
            };

使用表达式执行所有映射

List<MyClass> myClasses = query.Select(CustomTable123.TranslateExp).Distinct().ToList();

答案 1 :(得分:-1)

你可以将table1,table2和table3传递给MyClass构造函数并在那里进行属性设置吗? 如果你不能触摸MyClass而不是工厂模式来返回一个新建的具有属性设置的MyClass可能是合适的。

List<MyClass> myClasses = (from table1 in context.Table1
                      join table2 in context.Table2
                      on table1.Key equals table2.Key
                      join table3 in context.Table3
                      on table1.FK equals table3.Key
                      select new MyClass(table1, table2, table3)                         
                      ).Distinct().ToList();

List<MyClass> myClasses = (from table1 in context.Table1
                      join table2 in context.Table2
                      on table1.Key equals table2.Key
                      join table3 in context.Table3
                      on table1.FK equals table3.Key
                      select MyFactory.MakeMyClass(table1, table2, table3)                         
                      ).Distinct().ToList();

答案 2 :(得分:-2)

  

...表达更有用/可读的东西。

创建一个构造函数,用于本地化所需的业务逻辑:

public Class MyClass
{

   public MyClass(table1Class  t1Entity, table2Class t2Entity, table3Class t3Entity)
   {
      // Initialize/map the incoming the class instances
      propertyA = t1Entity.Key;
      ...
   }
}

然后Select的投影(是选择所做的,项目从一种类型投射到另一种)变得更容易阅读/使用

 ...                     
 on table1.FK equals table3.Key
 select new MyClass(table1, table2, table3){}).Distinct().ToList();