这个查询可以被破坏(正是这个,不是你真正的查询,它要复杂得多:-))
IQueryable<atype> query = a;
IQueryable<btype> query2 = from a1 in query
join join b1 in b on a1.id1 equals b1.id1
select b1;
IQueryable<ctype> query3 = from b1 in query2
join join c1 in c on b1.id1 equals c1.id1
select c1;
这些中的每一个都可以放入具有如下签名的方法中:
IQueryable<ctype> JoinQuery2(IQueryable<btype> query2)
{
IQueryable<ctype> query3 = from b1 in query2
join join c1 in c on b1.id1 equals c1.id1
select c1;
return query3;
}
这种类型的查询很容易被破坏,因为在每次加入后你都会丢弃“旧”类型(所以在最后query2
你只有select b1
,没有select a1+b1
)。如果您必须保留两个对象,那将是不可行的,因为您需要它是一个匿名对象,因为new { a1, b1 }
它是一个匿名对象,所以它不能被传递。
请注意,也许简单地将查询拆分为多个变量将解决您的 NPR 问题,因为分析器不会看到完整的方法链。
var query2 = from a1 in a
join join b1 in b on a1.id1 equals b1.id1
select b1;
var query3 = from b1 in query2
join join c1 in c on b1.id1 equals c1.id1
select c1;
在这种情况下,您甚至可以使用匿名对象,例如
var query1 = from a1 in a
join join b1 in b on a1.id1 equals b1.id1
select new { a1, b1 };
var query3 = from a1b1 in query2
join join c1 in c on a1b1.b1.id1 equals c1.id1
select new { a1b1.a1, a1b1.b1, c1 };
等等。