【问题标题】:How to make a flattening function for linq object (Linq To Entities for mysql)?如何为 linq 对象(Linq To Entities for mysql)制作展平功能?
【发布时间】:2015-08-14 17:42:37
【问题描述】:

我正在升级一个旧程序并使用 linq 进行基本选择,以便我可以在过程中学习 linq。 我有一项重复性任务,即仅显示来自各种连接的数据是网格视图, 下面是一个示例

protected void Page_Load(object sender, EventArgs e)
{
    using ( vavestockModel.vavestockEntities db = new vavestockModel.vavestockEntities())
    {
        var prod = (from p in db.products select p);
        var prodd = (from p in db.productdetails select p);
        var prode = (from p in db.product_extra_data select p);
        var join1 = (from p in prod
                     join
                         pd in prodd
                         on p.PrStyle equals pd.StyleCode
                     select new {pr=p,prd=pd }).ToList();
        var join2 = (from p in prod
                     join
                         pd in prodd
                         on p.PrStyle equals pd.StyleCode
                     select new { p.PrShow,p.PrPrice,pd.I_EAN_51,pd.I_EAN_50 }).ToList();
        var join3 = (from p in prod
                     join
                         pd in prodd
                         on p.PrStyle equals pd.StyleCode
                     select new { flattenmodel(p),flattenmodel(pd) }).ToList();

        Response.Write(join1);
        GridView1.DataSource = join1;
        GridView1.DataBind();
    }

}

??object flattenmodel(vavestockModel.vavestockEntities en)//? here i want to pass any table row
{
    string[] toren;
    //foreach (var item in en.)
    //{

    //}
    return toren;
}

join2 可以绑定到 gridview 而 join1 不能,因为它们返回实体对象。由于我必须选择所有列,为这么多表重复写入所有名称不是一个明智的选择,因此我想编写一个返回展平数据的函数。

但我发现很难继续。我的困难来了,因为我不知道在这种情况下应该返回什么并作为参数传递。有人能指出我继续前进的正确方向吗?

【问题讨论】:

  • 您的域对象只是 POCO 吗?您使用哪个版本的 EntityFramework?
  • 我用的是EF5,都是Framework自己生成的类。
  • 相反,您应该学习导航属性和投影,这将帮助您在没有连接的情况下编写更好的查询,您不应该在实体框架中使用连接。
  • 你的实体对象到底有什么问题?它们不能被序列化?另外,它们是否继承自 EntityObject ?
  • 没有问题,我唯一要做的就是不要写我要选择的所有列名,而是创建一个返回所有列值的函数,以便它可以绑定到gridview。

标签: mysql asp.net linq entity-framework


【解决方案1】:

您可以通过System.Reflection 获取对象的所有属性,这是一个示例,您可以从所有属性中获取值并将它们存储在List 中,然后您可以将此List 分配为数据源。

Entities ent = new Entities();
var data = (from x in ent.Employees where x.Id == 1 select x).FirstOrDefault();
List<string> list = ConvertToList(data);

public List<string> ConvertToList(object obj)
    {
        List<string> list = new List<string>();
        PropertyInfo[] pinfo = obj.GetType().GetProperties();
        foreach (var info in pinfo)
        {
            if (info.GetValue(obj) != null)
                list.Add(info.GetValue(obj, null).ToString());
        }
        return list;
    }

编辑

您也可以从匿名对象返回DataTable

public DataTable ConvertToDataTable(IEnumerable<dynamic> obj)
    {
        DataTable dt = new DataTable();
        foreach (dynamic item in obj)
        {
            DataRow dr = dt.NewRow();
            PropertyInfo[] pinfo = item.GetType().GetProperties();
            foreach (var info in pinfo)
            {
                if (!dt.Columns.Contains(info.Name))
                    dt.Columns.Add(info.Name, info.PropertyType);

                var val= info.GetValue(item, null);
                dr[info.Name] = val;

            }
            dt.Rows.Add(dr);
        }
        return dt;
    }

你会这样称呼它

Entities ent = new Entities();
var data = (from x in ent.Employees where x.Id == 1 select x).FirstOrDefault();
DataTable dt=ConvertToDataTable(data);

【讨论】:

  • 没有。它只会将其转换为列表,我不想要列表,而是一个匿名类,它包含两个类的所有值。
  • 在您的问题中,您提到您在 flattenmodel 函数中返回 strng 数组。 ?
  • @Ratna 它将包含传递给它的对象的所有值,您可以修改它并传递多个对象并从每个对象获取值并转换为列表,然后将该列表作为 gridview 的源。跨度>
  • 但我无法绑定它,因为每一行都包含一个列表,
  • 好吧,你可以制作一个数据表并在其中添加行,然后绑定这个表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2010-09-07
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多