# How to Get and Set Lookup Fields in Dynamics 365 CRM (JavaScript, Power Automate, Plugins, Web API)

In this blog, we’ll cover **how to work with lookups in four ways**:

* JavaScript (form scripts)
    
* Power Automate (Flow)
    
* Plugins (C#)
    
* Web API (OData / REST API)
    

Finally, we’ll walk through **real-world examples** you can apply directly in your projects.

## 🔹 1. Handling Lookups with JavaScript in Dynamics 365 CRM

Form scripts are useful when you want to manipulate lookup fields directly on CRM forms.

### ✅ Get a Lookup Value in JavaScript

```javascript
function getLookupValue(executionContext) {
    var formContext = executionContext.getFormContext();
    var lookup = formContext.getAttribute("parentaccountid").getValue();

    if (lookup != null) {
        var id = lookup[0].id;       // GUID of the record
        var name = lookup[0].name;   // Display name
        var entity = lookup[0].entityType; // Entity logical name

        console.log("ID: " + id + " | Name: " + name + " | Entity: " + entity);
    }
}
```

### ✅ Set a Lookup Value in JavaScript

```javascript
function setLookupValue(executionContext) {
    var formContext = executionContext.getFormContext();

    var lookupValue = [{
        id: "B0D4F3F4-1D3A-4D2A-9A54-8A1B2E6A9F6C",
        name: "Contoso Ltd",
        entityType: "account"
    }];

    formContext.getAttribute("parentaccountid").setValue(lookupValue);
}
```

## 🔹 2. Handling Lookups in Power Automate (Flow)

In **Power Automate**, lookup fields need to be set using the `@odata.bind` notation.

### ✅ Get a Lookup Value in Flow

When retrieving a Contact, a lookup field looks like this:

```json
"_parentaccountid_value": "b0d4f3f4-1d3a-4d2a-9a54-8a1b2e6a9f6c"
```

### ✅ Set a Lookup Value in Flow

To set a lookup, use:

```json
"parentaccountid@odata.bind": "/accounts(b0d4f3f4-1d3a-4d2a-9a54-8a1b2e6a9f6c)"
```

💡 In Flow expressions, you can build it dynamically:

```java
concat('/accounts(', outputs('Get_Account')?['body/accountid'], ')')
```

## 🔹 3. Handling Lookups in Plugins (C#)

In **Dynamics 365 Plugins**, lookups are handled using the `EntityReference` class.

### ✅ Get a Lookup Value in Plugin

```csharp
if (entity.Contains("parentaccountid") && entity["parentaccountid"] is EntityReference lookup)
{
    Guid id = lookup.Id;
    string name = lookup.Name;       // Sometimes null depending on context
    string logicalName = lookup.LogicalName;
}
```

### ✅ Set a Lookup Value in Plugin

```csharp
entity["parentaccountid"] = new EntityReference("account", 
    new Guid("B0D4F3F4-1D3A-4D2A-9A54-8A1B2E6A9F6C"));
```

## 🔹 4. Handling Lookups in Dynamics 365 Web API

When working with the **Dataverse Web API**, lookup values are accessed using the `_fieldname_value` convention.

### ✅ Get a Lookup Value via Web API

```powershell
GET [Organization URI]/api/data/v9.2/contacts(11111111-2222-3333-4444-555555555555)?$select=fullname,_parentcustomerid_value
```

Response:

```json
{
  "fullname": "John Doe",
  "_parentcustomerid_value": "b0d4f3f4-1d3a-4d2a-9a54-8a1b2e6a9f6c",
  "_parentcustomerid_value@OData.Community.Display.V1.FormattedValue": "Contoso Ltd",
  "_parentcustomerid_value@Microsoft.Dynamics.CRM.lookuplogicalname": "account"
}
```

* `_parentcustomerid_value` → The GUID of the lookup
    
* `FormattedValue` → The display name
    
* `lookuplogicalname` → The entity type
    

### ✅ Set a Lookup Value via Web API

```javascript
PATCH [Organization URI]/api/data/v9.2/contacts(11111111-2222-3333-4444-555555555555)
Content-Type: application/json

{
  "parentcustomerid_account@odata.bind": "/accounts(b0d4f3f4-1d3a-4d2a-9a54-8a1b2e6a9f6c)"
}
```

## 🔹 Real-World Examples

Let’s look at some **common business scenarios** where you’ll need to get or set lookup fields.

### Example 1: Setting a Contact’s Parent Account (JavaScript)

When a user selects an Industry, automatically assign the Contact to a default Account:

```javascript
if (formContext.getAttribute("industrycode").getValue() === 42) {
    var accountLookup = [{
        id: "D1C5E8F2-91AA-4C3E-8A14-7C32F1B9F77B",
        name: "Default Industry Account",
        entityType: "account"
    }];
    formContext.getAttribute("parentaccountid").setValue(accountLookup);
}
```

### Example 2: Assigning a Record Owner in Power Automate

When a new Lead is created, assign it to a specific user:

```json
"ownerid@odata.bind": "/systemusers(5a4b8f3f-1122-44aa-bbbb-998877665544)"
```

### Example 3: Updating Related Account from a Plugin

If a Contact is marked as "VIP", set its Parent Account to “VIP Clients”:

```csharp
if (entity.Contains("new_vipstatus") && (bool)entity["new_vipstatus"] == true)
{
    entity["parentaccountid"] = new EntityReference("account", 
        new Guid("E2F6B8D1-99F1-4B4D-8CC9-11B2A3D3F1AA"));
}
```

### Example 4: Web API — Linking a Case to a Customer

```javascript
PATCH [Organization URI]/api/data/v9.2/incidents(11111111-2222-3333-4444-555555555555)
Content-Type: application/json

{
  "customerid_contact@odata.bind": "/contacts(b0d4f3f4-1d3a-4d2a-9a54-8a1b2e6a9f6c)"
}
```

## 🎯 Conclusion

* **JavaScript** → Use `getValue()` and `setValue()` with `{id, name, entityType}` objects.
    
* **Power Automate (Flow)** → Use `@odata.bind` with `/entityname(guid)` syntax.
    
* **Plugins (C#)** → Work with `EntityReference`.
    
* **Web API** → Use `_lookupfield_value` for retrieval and `@odata.bind` for updates.
    

Understanding how to get and set lookups across different technologies in Dynamics 365 CRM makes your solutions more **flexible, scalable, and maintainable**.
