将实体框架结果传递给方法
本文关键字:方法 结果 实体 框架 | 更新日期: 2023-09-27 18:11:32
我调用了一个方法CreateTreeView()
,以便将一个平面的、自引用的表转换为如下所示的树视图。
ID | DisplayName | ParentID |
--------|----------------|------------|
1 | Top Level | NULL |
2 | Sub Level | 1 |
3 | Sub Level 2 | 2 |
4 | Top Level 2 | NULL |
public static void CreateTreeView()
{
using(var Context = new MyDBContext())
{
foreach(Department dept in Context.Departments.Where(d => d.IsVisible == true)
{
// Create the tree recursively
}
}
}
结果-- TopLevel
|---Sub Level
|--- Sub Level 2
-- TopLevel2
这可以完美地工作并输出一个JSON字符串,该字符串由前端的jtree拾取。
我正在努力的是,有时我需要从不同的表创建一个树视图。在上面的示例中,我正在查询Department表。然而,我想推广我的CreateTreeView()
方法来接受实体框架查询的结果,并在此基础上生成树。
使用旧的ADO。. NET方法,我会把结果塞进SqlDataReader
,并通过它们,并与之合作。然而,因为我是新的实体框架,我正在努力让我的头周围传递结果的方法,因为我可以在技术上传递任何查询结果到这,所以我如何派生对象类型等。
理想情况下,我会想象这样的东西(结果中的属性名称作为参数传递给方法)
public static void CreateTreeView(var results, string DataValueField, string ParentIDField, string DataTextField){
foreach(**UnknownObject** Result in results)
{
// Create the tree recursively
}
}
我已经尝试将方法中的结果参数定义为IQueryable
等,但正如我上面所说的,我不知道我要传递的实体的类型。
我想过为不同的实体类型创建方法重载,但我不确定这是否就是我需要的方式?这感觉就像我在复制代码,这让我很难过。
我只是在寻找正确方向的指针,我昨晚花了几个小时找东西,但我想我没有找得很好。
您将不得不使用一些泛型。一种方法是:
public static void CreateTreeView<TEntity, TValue>(IEnumerable<TEntity> results, Func<TEntity, TValue> dataField, Func<TEntity, int> parentField, Func<TEntity, string> dataTextField) {
foreach (TEntity result in results) {
var value = dataField(result);
var text = dataTextField(result);
int parentId = parentField(result);
// build your tree rerursively
}
}
这里有一组结果和一些函数,它们分别返回给定实体类型的值、文本和父id。用法是:
using(var Context = new MyDBContext())
{
var tree = CreateTreeView(Context.Departments.Where(d => d.IsVisible == true), c => c.DataField, c => c.ParentID, c => c.TextField);
}
另一种方法可能是为你的实体定义一个接口:
interface ITreeEntity<T> {
T Value {get;}
string TextField {get;}
int ParentID {get;}
}
并允许构建实现该接口的实体树。然后,您不需要通过函数显式地获取值。