相关疑难解决方法(0)

C#如何将Expression <Func <SomeType >>转换为Expression <Func <OtherType >>

我之前使用过基于lamdas的C#表达式,但我没有手工编写它们的经验.鉴于Expression<Func<SomeType, bool>> originalPredicate,我想创建一个Expression<Func<OtherType, bool>> translatedPredicate.

在这种情况下,SomeType和OtherType具有相同的字段,但它们不相关(没有继承而不是基于公共接口).

背景:我有一个基于LINQ to SQL的存储库实现.我将LINQ to SQL实体投影到我的Model实体,以便将我的模型保存在POCO中.我想将表达式传递给存储库(作为规范的一种形式),但它们应该基于模型实体.但我无法将这些表达式传递给数据上下文,因为它需要基于LINQ to SQL实体的表达式.

c# lambda expression-trees repository-pattern linq-to-sql

15
推荐指数
1
解决办法
1万
查看次数

手动为x => x.Child == itemToCompare.Child构建linq表达式

我们有一个对象,我们想要动态地基于该对象构建一个linq查询.这个linq语句等同于我们想要构建的内容:

Expression<Func<Sample, bool>> linqExpression 
            = x => x.Child == itemToCompare.Child;
Run Code Online (Sandbox Code Playgroud)

我们无法提出构建itemToCompare.Child部分的正确表达式.这是我们到目前为止所拥有的:

var param = Expression.Parameter(typeof(T), "x");
var key = itemToCompare.GetType().GetProperty("Child");
var rhsConstant = Expression.Constant(item);
var innerLambda = Expression.Lambda<Func<T>>(rhsConstant, 
            new ParameterExpression[0]);
var rhsMemberAccess = Expression.MakeMemberAccess(innerLambda, key);
body = Expression.Equal(lhsPropertyAccess, rhsMemberAccess);
var lambda = Expression.Lambda<Func<T, bool>>(body, param);
Run Code Online (Sandbox Code Playgroud)

我们手工构建的查询的表达式树如下所示:

Lambda Expression: x => (x.Child = value(SampleTests+Sample))
Expression Body: (x.Child = value(SampleTests+Sample))
Parameter 0: 'x', Type: Sample
NodeType: Lambda
   Left Lambda Expression: x.Child
   Left NodeType: MemberAccess
      Lambda Expression: x
      Expression Member: Sample Child
      NodeType: …
Run Code Online (Sandbox Code Playgroud)

linq lambda expression-trees

1
推荐指数
1
解决办法
4680
查看次数