Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
实体框架LINQ-动态选择属性_Linq_Entity Framework_Select_Dynamic - Fatal编程技术网

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

实体框架LINQ-动态选择属性,linq,entity-framework,select,dynamic,Linq,Entity Framework,Select,Dynamic,是否有可能以简单的方式创建一个动态选择器,如下面的一个,以及如何创建 Func<Company, string> companyName = x.CompanyName; Func<Company, int> companyId = x.CompanyId; var result = datacontext.Select(x => new { CompanyName = com

是否有可能以简单的方式创建一个动态选择器,如下面的一个,以及如何创建

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

        var result = datacontext.Select(x => new
        {
            CompanyName = companyName,
        CompanyId = companyId
        });
Func companyName=x.companyName;
Func companyId=x.companyId;
var result=datacontext.Select(x=>new
{
CompanyName=CompanyName,
CompanyId=CompanyId
});
上述代码引发异常:“无法创建'System.Func`2……类型的常量值。在此上下文中,仅支持基元类型或枚举类型。”

问题是,我需要从大约10个不同的表中动态地从可能的50个字段中选择多达8个字段,这些字段的类型可以是string、int、datetime null和not null。使用表达式动态构造选择器非常困难。解决这个问题的最佳方法是什么

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

但是原因在哪里呢?

您的函数应该如下所示:

Func<Company, string> companyName = (company => company.CompanyName);
Func<Company, int> companyId = (company => company.CompanyId);
我不知道如何为特定字段动态创建查询。您可以通过一次执行动态链接筛选器。。。除非您在每一行上存储了大量信息,或者正在加载数十万行,否则我不会担心它


另外,在主数据库过滤器中使用自定义函数时要小心。LINQ无法将所有命令转换为本机SQL查询,因此它可能会拉取整个表并在代码中进行过滤。请注意。

我不太确定你想要完成什么,但你想做的事情就这么简单吗

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

感谢Hamlet,但这给出了一个例外“LINQ to Entities中不支持LINQ表达式节点类型‘Invoke’”,我使用EF。关于原因:我使用动态选择的字段创建了一个大规模搜索过滤器,稍后将在网格中显示。过滤器部分已完成,但我无法使用select语句。最终目的是创建一个具有固定数量属性的匿名类型对象列表,并将其绑定到结果网格。好的,您可以使用表达式树来构建查询。我先尝试了这条路线,但很快就成功了,因为太冗长了,至少对我来说是这样。最后一个查询可能有多个连接、不同类型的属性等。为50个选项编写这些内容会使代码过于复杂。这会引发异常:LINQ to实体中不支持LINQ表达式节点类型“Invoke”“在顶行中,
x
的值是多少?我需要在匿名对象的50个字段中动态选择8个字段。companyName和companyId字段只是其中的两个。
    var result = datacontext.Select(x => new
    {
        CompanyName = x.companyName,
        CompanyId = x.companyId
    });