0

我正在尝试使用 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 而不是导航属性然后它可以工作,有人知道问题是什么吗?

4

1 回答 1

2

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

请注意,它会评估表达式树并将其转换为 SQL 语句或您正在使用的任何数据源。由于它无法以与托管代码中相同的方式比较整个对象,因此它也不会仅根据它们的键(甚至并不总是定义)来猜测这两个实体是否真的相等。

另一方面,比较两个原始值是它总是可以做的。

于 2013-05-02T10:38:10.000 回答