将实体框架结果传递给方法

本文关键字:方法 结果 实体 框架 | 更新日期: 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;}
}

并允许构建实现该接口的实体树。然后,您不需要通过函数显式地获取值。