我有这样的数据库结构(所有Parent和Childs都是表),
我在做什么
现在我想创建临时报告页面,让用户在这些表格中选择表格和列。
当用户选择表格和列时,他们可以添加过滤器(在列表中或包含或过滤等)到列。
我将所有这些信息作为json发送到Web服务将创建,然后在Web服务中我计划使用EntityFramework来获取所需的数据集。
我已经做了什么
我能够使用存储库和UOW,数据库等创建HTML UI,Web服务,数据库层。
问题
我的意思是我可以这样做,
var result = context.ParentA.Include("Child1.SubChild1").Include(....).Where(..
但我不知道如何指定我想要的列或添加过滤器。
答案 0 :(得分:0)
对于指定列名,您可以使用带有linq查询的select,如下所示:
var result = context.ParentA.Include("Child1.SubChild1").Include(....).Where(..).select(s=> new {Name = s.ParentName , SubName = s.SubChild.Name });
要添加过滤器,您需要在where子句
中定义它们.Where(p=>p.Name.contains("someValue"))
答案 1 :(得分:0)
如果你可以创建一个可以定义过滤器的类,那么你可以创建一个IQueryable<T>
添加过滤器:
class Filters
{
public bool FilterByColumnA { get; set; }
...
public bool FilterByColumnN { get; set; }
public int FromColumnA { get; set; }
public int ToColumnA { get; set; }
...
public string FromColumnN { get; set; }
public string ToColumnN { get; set; }
}
然后你可以构建查询:
IQueryable<Entity> query = context.Set<Entity>();
if (filters.FilterByColumnA)
query = query.Where(e => e.ColumnA > filters.FromColumnA && e.ColumnA < filters.ToColumnA);
...
if (filters.FilterByColumnN)
query = query.Where(e => e.ColumnN > filters.FromColumnN && e.ColumnN < filters.ToColumnN);
您可以查看this question了解详情。
要动态选择属性,您可以选择使用Include()
显式加载:
DbQuery<Entity> query = context.Set<Entity>();
foreach (var prop in properties)
query = query.Include(prop);
如果属性声明为virtual,则只有在需要值时才会将它们加载到内存中。例如,如果您使用OData,则可以从URL创建选择查询。
另一种解决方案可能是使用Expressions。
但如果您真的需要动态方法,可以查看nuget package。