EF获取.include

时间:2016-12-06 12:31:15

标签: c# winforms entity-framework

我的DAL图层上有以下内容:

    public List<customer> SelectAll()
    {
        using (ubmmsEntities db = new ubmmsEntities())
        {
            var result = db.customers
                         .Include(p => p.project_codes)
                         .OrderBy(c=>c.customer_name)
                         .ToList();
            return result;

        }
    }

基本上,这会向我返回客户列表及其各自的项目代码。使用返回的List,我在View上填写一个下拉列表:

        dropdown.DisplayMember = "customer_name";
        dropdown.ValueMember = "id";
        dropdown.DataSource = list;

这部分工作正常。但我有第二个下拉列表,用于根据客户下拉列表中选定的“customer_name”显示项目代码

下面的代码过滤了第二个下拉列表所需的结果:

var projects = list.Where(x => x.id.Equals(ddlCustomer.SelectedValue)).ToList();

所以,projects返回一个count = 1的对象。在执行中,如果我将鼠标移到我身上,我会[0] {System.Data.Entity.DynamicProxies....} 向下钻取,我得到一个项目代码列表(计数)。如果我再次向下钻取,我将按计划获得include中的信息的实际列表。到目前为止一切都很好。

问题是我现在知道如何访问它们以便将项目代码添加到我的项目中。

我尝试设置dropproject.DisplayMember = "project_name"(这是我想要的),但我能得到的只是对象类型{System.Data.Entity.DynamicProxies....},而不是其实际成员的值。< / p>

现在,我知道我可以在DAL上创建一个方法,根据下拉列表中选定的客户文本访问我的项目代码并快速排序,但因为我知道我有一个已包含我的客户的对象,他们的ID和项目代码,我想学习一种方法来将project_names存储在我的project_codes表中。

它可能是未来问题的解决方案......或者可能知道为什么我不应该这样做(我可以想到一些会导致性能问题的场景)

如果问题和信息足够,请告诉我,是否有任何帮助?

2 个答案:

答案 0 :(得分:2)

由于您加载了包括项目在内的客户,因此您无需使用查询来获取客户的项目。它足以使用客户的Projects属性(或者它的复杂属性,如project_codes):

var customer = (Customer)(customerComboBox.SelectetItem);
if(customer!=null)
{
    var projects = customer.Projects.ToList();
    //. . . 
}

答案 1 :(得分:1)

将您的查询更改为以下内容:

var projectCodes = list.Where(x => x.id.Equals(ddlCustomer.SelectedValue))
                       .Select(x => x.project_codes)
                       .FirstOrDefault();

这将为您提供所选客户的产品代码。使用该列表,您可以查询项目:

var projects = db.projects.Where(p => projectCodes.Contains(p.code)).ToList();

(我假设了一些名字,但这应该让你到那里)