Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LINQ上调用自定义(格式化)方法以创建实体_C#_Entity Framework_Asp.net Mvc 3_Linq To Entities_Entity Framework 4.1 - Fatal编程技术网

C# 在LINQ上调用自定义(格式化)方法以创建实体

C# 在LINQ上调用自定义(格式化)方法以创建实体,c#,entity-framework,asp.net-mvc-3,linq-to-entities,entity-framework-4.1,C#,Entity Framework,Asp.net Mvc 3,Linq To Entities,Entity Framework 4.1,我正在使用EF4.1,并试图为网格枚举一个公司列表。在当前项目中,我有两个选项:从DbContext实体中选择所有公司,并将它们从非匿名类型(例如EmpresaGrid)加载到对象中,或者选择所有公司到具有相同结构的匿名类型对象中,如Empresa,这是我选择的实体 第一个选项是为它创建一个模型类,这需要更多的工作,但最终会更具可读性。不过,我还是不确定。第二个选项是我现在正在使用的 所以,第一个问题:最好只创建一个用于显示数据的模型类,还是使用匿名类型?做直接选择是毫无疑问的:选择*太大了,我

我正在使用EF4.1,并试图为网格枚举一个公司列表。在当前项目中,我有两个选项:从DbContext实体中选择所有公司,并将它们从非匿名类型(例如EmpresaGrid)加载到对象中,或者选择所有公司到具有相同结构的匿名类型对象中,如Empresa,这是我选择的实体

第一个选项是为它创建一个模型类,这需要更多的工作,但最终会更具可读性。不过,我还是不确定。第二个选项是我现在正在使用的

所以,第一个问题:最好只创建一个用于显示数据的模型类,还是使用匿名类型?做直接选择是毫无疑问的:选择*太大了,我想这可能会让一切都变得非常缓慢。因此,选择另一种类型将创建一个只包含所需字段的自定义查询

使用第二个选项“匿名类型”,我有以下代码简化版本:

public static IEnumerable<object> Grid()
{
    Entities db = new Entities();

    var empresas = db.Empresas
        .Select(e => new
        {
            Cgc = e.Cgc, // PK
            (...)
            Address = new
            {
                AddressLine = e.EnderecoSede.AddressLine,
                (...)
            }
        },
        Contato = e.Contato,
        (...)
    })
    .ToList();

    return empresas;
}
但这不起作用,因为FormataCgc无法转换为SQL,我不想转换它。我也试过:

var empresas = db.Empresas
    .Select(e => new
    {
        Cgc = FormataCgc(e.Cgc),
    }
var empresas = db.Empresas
    .Select(e => new
    {
        (...)
    }
    .ToList();

foreach (var e in empresas) {
    e.Cgc = FormataCgc(e.Cgc);
}
但由于匿名类型只有只读属性,因此无法执行此操作

所以,我的第二个问题是:我究竟如何才能做到这一点?我需要在选择数据后更改它,但是否使用匿名类型?我做了一些研究,发现最好的是:。在该解决方案中,Ladislav建议从IEnumerable中进行第二次选择,但由于网格不包括Empresa,我无法这样做,我需要更改或添加属性,而不是封装它们


我不确定我是否足够清楚,但请随时提问。另外,我目前使用的网格是Telerik ASP.NET MVC网格,它接收IEnumerable,其中T是一个类,作为模型数据,它们迭代每个对象,发挥其神奇作用。

因为您已经将其转换为IEnumerable,所以您可以在客户端流式处理结果时进行自定义格式设置。执行db。选择,然后转换为适当的格式,即:

var empresas = db.Empresas
    .Select(e => new
    {
        (...)
    })
    .ToList();

foreach (var e in empresas) {
    yield return new {
       Cgc = FormataCgc(e.Cgc),
       // Copy other properties here, as needed...
    };
}
也就是说,我个人建议创建一个自定义类,不要返回匿名类型。您的转换将是:

foreach (var e in empresas) {
    yield return new YourClass(FormataCgc(e.Cgc), ...); // Construct as needed
}

这将极大地提高此方法的可用性,因为您可以从该方法的调用方获得对属性的正确命名访问。

我认为解决这两个问题的方法是创建一个模型类。当然,这是一个多一点的前期工作,但它将允许您在长期更大的灵活性。然后,自定义模型类可以为您处理格式设置

public class EmpresaGridModel
{
    public string Cgc { get; set; }

    public string CgcFormatted 
    {
        return FormataCgc(this.Cgc);
    }

    //properties for the other fields will have to be created as well obviously
}
然后,您的telerik网格可以直接绑定到CgcFormatted属性