我试图弄清楚如何只选择实体的导航属性的特定属性。
我使用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的特定仓库中进行了测试。