给定这样的类结构:
public class GrandParent
{
public Parent Parent { get; set;}
}
public class Parent
{
public Child Child { get; set;}
}
public class Child
{
public string Name { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
和以下方法签名:
Expression<Func<TOuter, TInner>> Combine (Expression<Func<TOuter, TMiddle>>> first, Expression<Func<TMiddle, TInner>> second);
Run Code Online (Sandbox Code Playgroud)
我如何实现所述方法,以便我可以像这样调用它:
Expression<Func<GrandParent, Parent>>> myFirst = gp => gp.Parent;
Expression<Func<Parent, string>> mySecond = p => p.Child.Name;
Expression<Func<GrandParent, string>> output = Combine(myFirst, mySecond);
Run Code Online (Sandbox Code Playgroud)
这样输出结果如下:
gp => gp.Parent.Child.Name
Run Code Online (Sandbox Code Playgroud)
这可能吗?
每个Func的内容只会是一个MemberAccess.我宁愿不最终output成为嵌套函数调用.
谢谢
因此,我想对我的数据进行常规分类。我有这段代码从数据库中获取数据,该数据库将仅提取包含的数据value。
using System.Linq.Dynamic;
public static IQueryable<object> SortList(string searchString, Type modelType,
IQueryable<object> model)
{
....
string toStringPredicate = type == typeof(string) ? propertyName +
".Contains(@0)" : propertyName + ".ToString().Contains(@0)";
model = model.Where(propertyName + " != NULL AND " + toStringPredicate, value);
}
Run Code Online (Sandbox Code Playgroud)
该模型是这样的:
public class ManageSubscriberItems
{
public int? UserId { get; set; }
public string Email { get; set; }
public Guid SubscriberId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我打电话时:
models = (IQueryable<ManageSubscriberItems>)EcommerceCMS.Helpers.FilterHelper
.SortList(searchString, typeof(ManageSubscriberItems), models);
if(models.Any())
Run Code Online (Sandbox Code Playgroud)
它引发此错误:
“ …
使用 Entity Framework Core 进行查询时,我使用表达式转换为 DTO 对象,这对于对象和任何子集合都很有效。
一个简化的例子:
模型:
public class Model
{
public int ModelId { get; set; }
public string ModelName { get; set; }
public virtual ICollection<ChildModel> ChildModels { get; set; }
// Other properties, collections, etc.
public static Expression<Func<Model, ModelDto>> AsDto =>
model => new ModelDto
{
ModelId = model.ModelId,
ModelName = model.ModelName,
ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList()
};
}
Run Code Online (Sandbox Code Playgroud)
询问:
dbContext.Models.Where(m => SomeCriteria).Select(Model.AsDto).ToList();
Run Code Online (Sandbox Code Playgroud)
我的问题是试图找到一种方法为非集合的孩子做类似的事情。如果我已添加到我的模型中:
public AnotherChildModel AnotherChildModel { get; set; }
Run Code Online (Sandbox Code Playgroud)
我可以在表达式中添加转换:
public static Expression<Func<Model, ModelDto>> AsDto …Run Code Online (Sandbox Code Playgroud)