ASP.NET Core / EFCore - System.Linq.Dynamic - 仅选择导航属性

时间:2017-10-08 12:03:26

标签: c# asp.net linq asp.net-core-mvc entity-framework-core

我试图弄清楚如何只选择实体的导航属性的特定属性。

我使用ASP.NET Core MVC和EntityFramework Core与System.Linq.Dynamic.Core库。我必须使用动态linq,因为我在编译时不知道实体的属性名称(它用于网格,我想动态使用它)。

实体:

public class ActionLog : BaseEntity
{
    public int ID { get; set; }
    public string Description { get; set; }

    public string UserId { get; set; }
    public virtual ApplicationUser User { get; set; }

    public string AffectedUserId { get; set; }
    public virtual ApplicationUser AffectedUser { get; set; }

    public int ActionType { get; set; }
    public int Action { get; set; }
    public int LogLevel { get; set; }

    public DateTime DateCreated { get; set; }
}

在回购中选择:

public List<TEntity> FilterForGrid(DataManager dm, params IncludeEntity[] includes)
    {
        var Data = Set.AsQueryable();

        foreach (var join in includes)
        {
                    Data = Data.Include(join.Include);               
        }

        Data = Data.Select<TEntity>("new(it.ID, it.Description, it.DateCreated, it.User.Email)");


        ...


        return Data.ToList();
    }

(出于测试目的,我想要选择硬编码的道具)

但是,当我尝试运行FilterForGrid方法时,它会抛出异常: System.ArgumentNullException:&#39;值不能为空。&#39;

消息:

  

&#34;值不能为空。\ r \ n \ nParameter name:member&#34;

堆栈追踪:

  

&#34;在System.Linq.Expressions.Expression.Bind(MemberInfo成员,   表达式)\ r \ n at   System.Linq.Dynamic.Core.ExpressionParser.CreateNewExpression(列出1 properties, List 1个表达式,输入newType)in   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   1379 \ r \ n在System.Linq.Dynamic.Core.ExpressionParser.ParseNew()中   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   1317 \ r \ n at   System.Linq.Dynamic.Core.ExpressionParser.ParseIdentifier()in   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   1140 \ r \ n在System.Linq.Dynamic.Core.ExpressionParser.ParsePrimary()   在   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   894 \ r \ n在System.Linq.Dynamic.Core.ExpressionParser.ParseUnary()中   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   889 \ r \ n at   System.Linq.Dynamic.Core.ExpressionParser.ParseMultiplicative()in   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   835 \ r \ n在System.Linq.Dynamic.Core.ExpressionParser.ParseAdditive()   在   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   804 \ r \ n at   System.Linq.Dynamic.Core.ExpressionParser.ParseShiftOperator()in   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   780 \ r \ n at   System.Linq.Dynamic.Core.ExpressionParser.ParseComparisonOperator()in   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   639 \ r \ n at   System.Linq.Dynamic.Core.ExpressionParser.ParseLogicalAndOrOperator()   在   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   594 \ r \ n在System.Linq.Dynamic.Core.ExpressionParser.ParseIn()中   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   514 \ r \ n at   System.Linq.Dynamic.Core.ExpressionParser.ParseAndOperator()in   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   497 \ r \ n at   System.Linq.Dynamic.Core.ExpressionParser.ParseOrOperator()in   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   482 \ r \ n at   System.Linq.Dynamic.Core.ExpressionParser.ParseLambdaOperator()in   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   452 \ r \ n at   System.Linq.Dynamic.Core.ExpressionParser.ParseNullCoalescingOperator()   在   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   439 \ r \ n at   System.Linq.Dynamic.Core.ExpressionParser.ParseConditionalOperator()   在   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   422 \ r \ n在System.Linq.Dynamic.Core.ExpressionParser.Parse(Type   resultType,Boolean createParameterCtor)in   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ ExpressionParser.cs:线   369 \ r \ n at   System.Linq.Dynamic.Core.DynamicExpressionParser.ParseLambda(布尔   createParameterCtor,ParameterExpression []参数,Type   resultType,String expression,Object [] values)in   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ DynamicExpressionParser.cs:线   107 \ r \ n at   System.Linq.Dynamic.Core.DynamicQueryableExtensions.Select [TResult](IQueryable的   source,String selector,Object [] args)in   C:\ Users \用户azureuser \文件\ Github上\ System.Linq.Dynamic.Core \ SRC \ System.Linq.Dynamic.Core \ DynamicQueryableExtensions.cs:线   1033 \ r \ n at   ProjectS.DAL.Repositories.Repository`1.FilterForGrid(DataManager dm,   IncludeEntity []包括)in   C:\ Users \用户米莎\源\回购\项目\ DAL \库\ Repository.cs:线   321 \ r \ n at   ProjectS.Core.Services.LogService.FilterForGrid(DataManager dm,   IncludeEntity []加入)   C:\ Users \用户米莎\来源\回购\项目\核心\ SERVICES \ LogService.cs:行   136 \ r \ n at   ProjectS.Web.Areas.Admin.Controllers.LogController.GetActionLogData(DataManager的   dm)in   C:\ Users \用户米莎\来源\回购\项目\项目\地区\管理\ \控制器LogController.cs:行   50 \ r \ n在lambda_method(Closure,Object,Object [])\ r \ n at   Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(对象   target,Object [] parameters)\ r \ n at   Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__12.MoveNext()&#34;

当我删除&#34; it.User.Email&#34;时,它有效。

当我查看Linq.Dynamic.Core来源 - 进入测试时,他们使用它的方式相同,看起来它正在工作......

我做错了什么?有什么想法吗?

谢谢。

编辑:

其他信息: 静态linq(测试和工作):

        Data = Data.Select(a => new ActionLog
        {
            ID = a.ID,
            Description = a.Description,
            DateCreated = a.DateCreated,

            User = new ApplicationUser
            {
                Email = a.User.Email,
            }
我的测试中的

TEntity 是ActionLog。 它使用通用的回购。静态LINQ在ActionLog的特定仓库中进行了测试。

0 个答案:

没有答案