实体框架LINQ - 动态选择属性

时间:2014-01-27 14:25:00

标签: linq entity-framework select dynamic

是否可以以简单的方式创建如下所示的动态选择器,以及如何?

        Func<Company, string> companyName = x.CompanyName;
        Func<Company, int> companyId = x.CompanyId;

        var result = datacontext.Select(x => new
        {
            CompanyName = companyName,
        CompanyId = companyId
        });

上面的代码抛出异常:“无法创建类型'System.Func`2的常量值......在此上下文中仅支持基本类型或枚举类型。”

问题是我需要从大约10个不同的表中动态选择最多8个字段,这些字段可以是string,int,datetime nullable和not null的类型。使用Expressions动态构造选择器很安静。解决这个问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

var result = datacontext.Select(x => new
        {
            CompanyName = mcname(x),
            CompanyId = companyId(x)
        });

但原因在哪里?

答案 1 :(得分:0)

你的Func应该是这样的:

Func<Company, string> companyName = (company => company.CompanyName);
Func<Company, int> companyId = (company => company.CompanyId);

使用你的功能:

var result = datacontext.Select(x => new
        {
            CompanyName = companyName(x),
            CompanyId = companyId(x)
        });

我不知道为特定字段动态创建查询的方法。您可以通过一次执行动态链接过滤器...除非您在每行上存储大量信息或正在加载数十万行,否则我不会担心它。

P.S。您需要小心使用主数据库筛选器中的自定义函数。 LINQ无法将所有命令转换为本机SQL查询,因此最终可能会拉动整个表并在代码中进行过滤。请注意。

答案 2 :(得分:0)

我不完全确定你想要完成什么,但你能想做的就像这样吗?

    var result = datacontext.Select(x => new
    {
        CompanyName = x.companyName,
        CompanyId = x.companyId
    });