Linq 如何实现外部连接表达式树?

Linq 如何实现外部连接表达式树?,linq,join,lambda,expression,outer-join,Linq,Join,Lambda,Expression,Outer Join,我需要使用表达式语法实现查询(因为我不知道编译时的类型)。例如,像这样的查询: 来自客户中的客户 参与购买 在customer.ID上等于purchase.CustomerID 穿上外衣 来自outerJoin.DefaultIfEmpty()中的范围 哪里 customer.Name==“SomeName”&& range.Description.Contains(“SomeString”)&& customer.ID==range.CustomerID 选择 新{Customer=Custo

我需要使用表达式语法实现查询(因为我不知道编译时的类型)。例如,像这样的查询:

来自客户中的客户
参与购买
在customer.ID上等于purchase.CustomerID
穿上外衣
来自outerJoin.DefaultIfEmpty()中的范围
哪里
customer.Name==“SomeName”&&
range.Description.Contains(“SomeString”)&&
customer.ID==range.CustomerID
选择
新{Customer=Customer,Purchase=range}
我找到了实现组连接部分的方法,如下所示:

ITable p=\u dataContext.GetTable(typeof(Purchases));
ITable c=_dataContext.GetTable(typeof(Customers));
LambdaExpression outerSelectorLambda=DynamicExpression.ParseLambda(typeof(Customers),null,“ID”);
LambdaExpression innerSelectorLambda=DynamicExpression.ParseLambda(typeof(Purchases),null,“CustomerID”);
ParameterExpression param1=表达式参数(类型为(客户),“客户”);
ParameterExpression param2=Expression.Parameter(typeof(IEnumerable),“purchases”);
ParameterExpression[]参数=新的ParameterExpression[]{param1,param2};
LambdaExpression resultsSelectorLambda=DynamicExpression.ParseLambda(参数,null,“新(客户即客户,购买即购买)”;
MethodCallExpression joinCall=
表情,打电话(
类型(可查询),
“群组加入”,
新类型[]{
(客户)的类型,
(采购)类型,
outerSelectorLambda.Body.Type,
结果selectorlambda.Body.Type
},
c、 表情,
p、 表情,
Expression.Quote(outerSelectorLambda),
Expression.Quote(innerSelectorLambda),
Expression.Quote(resultselectorlambda)
);
但我不知道如何使用这种语法编写查询的其余部分。
有人能帮我吗?

我刚刚在dynamic.cs中复制并粘贴了“join”实现,并做了一些更改以使“GroupJoin”生效

公共静态IQueryable GroupJoin(此IQueryable外部、IEnumerable内部、字符串外部选择器、字符串内部选择器、字符串结果选择器、参数对象[]值)
{
如果(inner==null)抛出新的ArgumentNullException(“inner”);
如果(outerSelector==null)抛出新的ArgumentNullException(“outerSelector”);
如果(innerSelector==null)抛出新的ArgumentNullException(“innerSelector”);
如果(resultsSelector==null)抛出新的ArgumentNullException(“resultsSelector”);
LambdaExpression outerSelectorLambda=DynamicExpression.ParseLambda(outer.ElementType,null,outerSelector,value);
LambdaExpression innerSelectorLambda=DynamicExpression.ParseLambda(inner.AsQueryable().ElementType,null,innerSelector,values);
Type resultType=typeof(IEnumerable).MakeGenericType(inner.AsQueryable().ElementType);
ParameterExpression[]参数=新的ParameterExpression[]
{
Expression.Parameter(outer.ElementType,“outer”)、Expression.Parameter(resultType,“inner”)
};
LambdaExpression resultsSelectorLambda=DynamicExpression.ParseLambda(参数,null,结果选择器,值);
返回outer.Provider.CreateQuery(
表情,打电话(
typeof(可查询),“GroupJoin”,
新类型[]{outer.ElementType,inner.AsQueryable().ElementType,outerSelectorLambda.Body.Type,resultsSelectorLambda.Body.Type},
Expression,inner.AsQueryable().Expression,Expression.Quote(outerSelectorLambda),Expression.Quote(innerSelectorLambda),Expression.Quote(resultsSelectorLambda));
}

我将遵循一种方法来实现这一点:

  • 获取LINQ查询的等价表达式

  • 获取从LINQ查询中提取的表达式的ToString()

  • 学习表达式,了解输入参数、类型参数、表达式参数等

  • 如果提到的方法不清楚,请与我联系