pnp / powershell

PnP PowerShell
https://pnp.github.io/powershell
MIT License
683 stars 348 forks source link

[BUG] Set-PnPListItem not working on lists with more than 12 lookup columns #4311

Open ohaak2 opened 1 month ago

ohaak2 commented 1 month ago

Expected behavior

Using Set-PnPListItem to update some values of a list item in a list having more than 12 lookup columns shouldn't run into this lookup column threshold issue as long as we are not trying to set more than 12 lookup columns in that operation.

Actual behavior

We will get the error message that the list we are operating on is exeeding the 12 lookup column threshold and thus the query couln't be processed.

Steps to reproduce behavior

What is the version of the Cmdlet module you are running?

2.12.0

Which operating system/environment are you running PnP PowerShell on?

ohaak2 commented 1 month ago

I've checked the code to clarify why PnP.PowerShell is obviouslty trying to query all list columns while I'm just trying to update e.g just one field.

Found the following code in class ListItemHelper:

image

I think it should be possible to query just the fields that are acutally rerference in the Cmdlets "value" Parameter. That way it should be easy to avoid that threshold issue.

I've verified my theory using the Set-PnPTaxonomyFieldValue Cmdlet on that same list - with no issues at all. Here the code (in Microsoft.SharePointClient.TaxonomyExtensions) is just loading the field in question and everything works fine:

image

ohaak2 commented 1 month ago

By the way - this is the error message we're currently facing: The query cannot be completed because the number of lookup columns it contains exceeds the lookup column threshold.

I'm even getting this error, if I'm just trying to change the item's content type using Set-PnPListItem. No additional values involved. And all this just because SetFieldValues is trying to load all fields involved (for whatever reason).

Tanddant commented 1 month ago

As a workaround, what happens if you load the item and updated it manually?

Something like this (don't have PowerShell handy right now, but you should be able to get it to work)

$li = Get-PnPListItem -Identity 1
$li["Fieldname"] = "New Value"
$li.update();
Invoke-PnPQuery
ohaak2 commented 1 month ago

@Tanddant Yes, indeed. That's working for me. I've already tested a fix for the code behind Set-PnPListItem. The trick is to avoid the query for all fields as mentioned in my post above:

image

I'm avoiding to load all fields by query. The only fields the code now loads are the ones involved, if you provide any value updates.

My fix so far just involved the single item update - not the batch operation. The latter one is unfortunately far more tricky.