使用导航属性和linq错误创建对象

本文关键字:linq 错误 创建对象 属性 导航 | 更新日期: 2023-09-27 18:11:52

我正在尝试使用linq创建一些实体,并且必须做错误的事情

var ptemp = repository.PackageTemplates.Where(f => f.employeeId == data.EmployeeId).SingleOrDefault();
File file = AddFileStreams(StrToByteArray(data.FileDataIn), data.FileNameForDevice, repository, packageTypeItemId);
// add new packageItemTemplate
var pit = AddPackageItemTemplate((PackageTemplate)ptemp, file, repository, EnumPackageItemTemplatesCommand.DownloadFile, 0);
// Adds package Item for each package
repository.Packages.Where(pi => pi.PackageTemplate == ptemp).ToList().ForEach(pk =>
{
  AddPackageItem(pit, pk, repository);
});

错误是将Packages的类型传递给另一个函数作为LINQ ForEach()的一部分,pit的类型没有问题,我是否需要先创建一个列表并在之后循环?我似乎找不到一个解释。

我收到的错误信息是:

Unable to create a constant value of type 'PackageTemplate'. 
Only primitive types ('such as Int32, String, and Guid') are supported 
in this context.

如果我改成:

  // Adds package Item for each package
            repository.Packages.Where(pi => pi.PackageTemplateId == ptemp.Id).Select(pk => pk).ToList().ForEach(pk =>
            {
              AddPackageItem(pit, pk, repository);
            });

并在where子句中使用ID而不是导航属性,然后它工作,有人知道问题是什么吗?

使用导航属性和linq错误创建对象

不幸的是,这就是它的工作方式。

请注意,它对表达式树求值并将其转换为SQL语句或您正在使用的任何数据源。因为它不能像在托管代码中那样比较整个对象,所以它也不会仅仅根据它们的键来猜测两个实体是否真的相等(甚至不总是定义键)。

另一方面,比较两个基本值是总是能做到的。

相关文章: