我尝试使用表达式树构建子查询。在linq中我会写一些类似的东西:
var single = MyTable
.AsExpandable()
.Select(c => new
{
Childs = Enumerable.Select(
MyTable.VisibleChilds.Invoke(c, dbContext),
cc => Convert(cfg.ChildsConfig).Invoke(dbContext, cc))
});
其中Convert
正在构建类似
p => new MyTableSelect {
Id = p.Id,
Name = p.Name
}
取决于配置中的给定值(仅从数据库中读取所需数据)。
但是我要将第二个参数转移到Select
调用,因为我需要将cc
传递给Convert-call。
我想我需要像Expression.Lambda<Func<>>
这样的东西,但我不会看到它。
Expression.Lambda&gt;(Expression.Invoke(Instance.Convert(cfg.ChildOrganizersFilterConfig),ContextParameter,theEntity));
答案 0 :(得分:0)
我不熟悉您对Invoke的使用,但如果您只想运行转换器&#39;用于Linq表达式的流畅语法我可以向您展示一个例子。假设我有三个POCO类,一个父容器,一个子容器和一个我想要转换为的容器。
Public Sub Init(ByVal category1 As String)
ReDim pCategories(0 To 29) As String
pCategories(0) = category1
End Sub
我可以写一个转换器方法将ChildPOC带到ChildPOCAlter,如下所示:
With foo
.Init "bar"
.Category(1) = "smurf"
.Category(2) = "blah"
'...
End With
然后我可以填充一些数据:
public class POC
{
public int Id { get; set; }
public string Name { get; set; }
public POC(int id, string name)
{
Id = id;
Name = name;
}
}
public class ChildPOC
{
public int ParentId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public ChildPOC(int parentId, string firstName, string lastName)
{
ParentId = parentId;
FirstName = firstName;
LastName = lastName;
}
}
public class ChildPOCAlter
{
public int ParentId { get; set; }
public string Name { get; set; }
public ChildPOCAlter(string first, string last, int parentId)
{
ParentId = parentId;
Name = $"{first} {last}";
}
}
然后我可能想要采用这些关系并在其上直接应用转换器:
public static Converter<ChildPOC, ChildPOCAlter> ChildPOCOAlter()
{
return new Converter<ChildPOC, ChildPOCAlter>((x) => { return new ChildPOCAlter(x.FirstName, x.LastName, x.ParentId); });
}