使用导航属性和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而不是导航属性,然后它工作,有人知道问题是什么吗?
不幸的是,这就是它的工作方式。
请注意,它对表达式树求值并将其转换为SQL语句或您正在使用的任何数据源。因为它不能像在托管代码中那样比较整个对象,所以它也不会仅仅根据它们的键来猜测两个实体是否真的相等(甚至不总是定义键)。
另一方面,比较两个基本值是总是能做到的。