实体框架Linq两个表格一起格式化

时间:2015-01-24 23:03:42

标签: c# linq entity-framework

我非常关注实体框架以及工作原理。在大多数情况下,我可以使用以下方法返回List,并且可以将其绑定到类似DropDownList的内容:

    public static List<Data.Land> GetLandList()
    {
        List<Data.Land> ListEntities = null;

        using (Data.languagesEntities context = GetDbContext())
        {
            ListEntities = (from ent1 in context.Land
                            orderby ent1.Land_sortering ascending, ent1.Land1 ascending
                            select ent1).ToList<Data.Land>();
        }

        return ListEntities;
    }

但是对于另一个DropDownList,我需要将两个表“Linq”放在一起并从多个tablecells中连接值以获得我想要显示的所需文本。我最终得到了一些我无法提取的隐藏代码:

public class DropdownDisplay
{
public string value { get; set; }
public string Text { get; set; }
}

void Input_DropDownList_SelectCourse_SelectedItemChanged(object sender, BootstrapUI.UserControls.BootstrapFormControls.DropDownListItemEventArgs e)
{
    int Cursus_ID = Convert.ToInt16(this.Input_DropDownList_SelectCourse.Value);

    Data.languagesEntities context = Data._languagesEntities.GetDbContext();

    var ListEntities = (from ent1 in context.Cursusdata
                        from ent2 in context.Cursus
                        where ent1.Cursus_ID == Cursus_ID
                        && ent1.Cursus_ID == ent2.Cursus_ID
                        && ent1.Cursusdata_gesloten == 0
                        orderby ent1.Cursusdata_startdatum ascending
                        select new
                        {
                            Cursusdata_ID = ent1.Cursusdata_ID,
                            Cursus_Code = ent2.Cursus_Code,
                            Cursusdata_einddatum = ent1.Cursusdata_einddatum,
                            Cursusdata_startdatum = ent1.Cursusdata_startdatum,
                            Cursusdata_tijden_NL = ent1.Cursusdata_tijden_NL,
                            Cursusdata_tijden_UK = ent1.Cursusdata_tijden_UK,
                            Cursus_ID = ent1.Cursus_ID
                        }
                        ).ToList();

    List<DropdownDisplay> List_DropdownDisplay = new List<DropdownDisplay>();
    foreach (var Entity in ListEntities)
    {
        string newStartDatum = (Entity.Cursusdata_startdatum == null) ? "" : ((DateTime)Entity.Cursusdata_startdatum).ToShortDateString();
        string newEindDatum = (Entity.Cursusdata_einddatum == null) ? "" : ((DateTime)Entity.Cursusdata_einddatum).ToShortDateString();

        List_DropdownDisplay.Add(new DropdownDisplay()
        {
            value = Entity.Cursusdata_ID.ToString(),
            Text =
                Entity.Cursus_Code + " - " + newStartDatum +
                " - " + newEindDatum + " - " + Entity.Cursusdata_tijden_NL
        });
    }

    this.Input_DropDownList_SelectPeriod.DataSource = List_DropdownDisplay;
    this.Input_DropDownList_SelectPeriod.DataValueField = "Value";
    this.Input_DropDownList_SelectPeriod.DataTextField = "Text";
    this.Input_DropDownList_SelectPeriod.DataBind();
  }

我应该如何以适当的方式做到这一点?

编辑:我应该澄清一下我的问题:t3chb0t的答案确实在方法中提取了我的解决方案,但我也想知道如何改进数据收集和操作。

非常感谢, 雷米

1 个答案:

答案 0 :(得分:1)

我建议如下:

只需在第一个DDL中获取Cursus_ID并为另一个DDL调用更新方法:

void Input_DropDownList_SelectCourse_SelectedItemChanged(
    object sender, 
    BootstrapUI.UserControls.BootstrapFormControls.DropDownListItemEventArgs e)
{
    int Cursus_ID = Convert.ToInt16((sender as Input_DropDownList_SelectCourse).Value);
    Update_Input_DropDownList_SelectPeriod(Cursus_ID);
}

使用辅助方法更新其他DDL:

void Update_Input_DropDownList_SelectPeriod(int Cursus_ID)
{
    List<DropdownDisplay> dropdownDisplayList = GetDropdownDisplayList(Cursus_ID);
    Input_DropDownList_SelectPeriod.DataSource = dropdownDisplayList;
    Input_DropDownList_SelectPeriod.DataValueField = "Value";
    Input_DropDownList_SelectPeriod.DataTextField = "Text";
    Input_DropDownList_SelectPeriod.DataBind();
}

使用其他辅助方法获取其他DDL的数据:

List<DropdownDisplay> GetDropdownDisplayList(Int16 Cursus_ID)
{
    Data.languagesEntities context = Data._languagesEntities.GetDbContext();

    var ListEntities =
        from ent1 in context.Cursusdata
        from ent2 in context.Cursus
        where ent1.Cursus_ID == Cursus_ID
        && ent1.Cursus_ID == ent2.Cursus_ID
        && ent1.Cursusdata_gesloten == 0
        orderby ent1.Cursusdata_startdatum ascending
        select new
        {
            Cursusdata_ID = ent1.Cursusdata_ID,
            Cursus_Code = ent2.Cursus_Code,
            Cursusdata_einddatum = ent1.Cursusdata_einddatum,
            Cursusdata_startdatum = ent1.Cursusdata_startdatum,
            Cursusdata_tijden_NL = ent1.Cursusdata_tijden_NL,
            Cursusdata_tijden_UK = ent1.Cursusdata_tijden_UK,
            Cursus_ID = ent1.Cursus_ID
        };

    List<DropdownDisplay> List_DropdownDisplay = new List<DropdownDisplay>();
    foreach (var Entity in ListEntities.ToList())
    {
        string newStartDatum = (Entity.Cursusdata_startdatum == null) ? "" : ((DateTime)Entity.Cursusdata_startdatum).ToShortDateString();
        string newEindDatum = (Entity.Cursusdata_einddatum == null) ? "" : ((DateTime)Entity.Cursusdata_einddatum).ToShortDateString();

        List_DropdownDisplay.Add(new DropdownDisplay()
        {
            value = Entity.Cursusdata_ID.ToString(),
            Text =
                Entity.Cursus_Code + " - " + newStartDatum +
                " - " + newEindDatum + " - " + Entity.Cursusdata_tijden_NL
        });
    }
    return List_DropdownDisplay;
}

编辑:

在较短版本的查询中,您可以立即创建DropdownDisplay对象,而无需中间匿名对象:

List<DropdownDisplay> GetDropdownDisplayList(Int16 Cursus_ID)
{
    Data.languagesEntities context = Data._languagesEntities.GetDbContext();

    var ListEntities =
        from ent1 in context.Cursusdata
        from ent2 in context.Cursus
        where 
            ent1.Cursus_ID == Cursus_ID
            && ent1.Cursus_ID == ent2.Cursus_ID
            && ent1.Cursusdata_gesloten == 0
        orderby ent1.Cursusdata_startdatum ascending            
        select new DropdownDisplay
        {
            value = ent1.Cursusdata_ID.ToString(),
            Text = String.Format(
                "{0}-{1}-{2}-{3}",
                ent2.Cursus_Code,
                ent1.Cursusdata_startdatum == null ? string.Empty : ((DateTime)ent1.Cursusdata_startdatum).ToShortDateString(),
                ent1.Cursusdata_einddatum == null ? string.Empty : ((DateTime)ent1.Cursusdata_einddatum).ToShortDateString(),
                ent1.Cursusdata_tijden_NL
            )
        };

    return ListEntities.ToList();
}

最酷的方式仍然是让DropdownDisplay类根据给定的数据为其属性创建值:

public class DropdownDisplay
{
    public DropdownDisplay(EntityType1 ent1, EntityType2 ent2)
    {
        value = ent1.Cursusdata_ID.ToString();
        Text = String.Format(
            "{0}-{1}-{2}-{3}",
            ent2.Cursus_Code,
            ent1.Cursusdata_startdatum == null ? string.Empty : ((DateTime)ent1.Cursusdata_startdatum).ToShortDateString(),
            ent1.Cursusdata_einddatum == null ? string.Empty : ((DateTime)ent1.Cursusdata_einddatum).ToShortDateString(),
            ent1.Cursusdata_tijden_NL
        );
    }
    public string value { get; set; }
    public string Text { get; set; }
}

然后查询会更短:

List<DropdownDisplay> GetDropdownDisplayList(Int16 Cursus_ID)
{
    Data.languagesEntities context = Data._languagesEntities.GetDbContext();

    var ListEntities =
        from ent1 in context.Cursusdata
        from ent2 in context.Cursus
        where 
            ent1.Cursus_ID == Cursus_ID
            && ent1.Cursus_ID == ent2.Cursus_ID
            && ent1.Cursusdata_gesloten == 0
        orderby ent1.Cursusdata_startdatum ascending            
        select new DropdownDisplay(ent1, ent2);

    return ListEntities.ToList();
}