我有一个带有非常冗长的选择列表的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可以使一切变得更加容易。
答案 0 :(得分:0)
如果您要从相同的课程(MyClass
,Table1
,Table2
)创建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();