簡體   English   中英

使用包含.Where子句的Lambda表達式

[英]Lambda expression with .Where clause using Contains

連接到CRM 2013時,有一種智能方法可以創建一個lambda表達式,以獲取GUID在List中的實體。

此代碼在Where子句上中斷並給出錯誤:

“where”條件無效。 實體成員正在調用無效的屬性或方法。

碼:

    private List<UserInformationProxy> GetContactsFromGuidList(List<Guid> contactList)
    {
        var result = _serviceContext.ContactSet
            .Where(x=> contactList.Contains((Guid) x.ContactId)) // this line breaks
            .Select(x => new UserInformationProxy()
            {
                FullName = x.FullName,
                Id = x.ContactId
            })
            .Distinct()
            .ToList<UserInformationProxy>();

        return result;
    }

    // return class
    public class UserInformationProxy
    {
        public Guid? Id { get; set; }
        public string FullName { get; set; }
        public string DomainName { get; set; }
    }

目前我通過從ContactSet中獲取所有聯系人並在我的代碼中使用循環來整理我想要的聯系人來解決這個問題。 這是有效的,但是速度很慢,因為我需要獲得所有10000個聯系人,而不是將實際感興趣的40 Im的Guids發送到SQL服務器。

QueryExpressions支持In運算符,所以這應該可以正常工作:

private List<UserInformationProxy> GetContactsFromGuidList(List<Guid> contactList)
{
    var qe = new QueryExpression(Contact.EntityLogicalName);
    qe.ColumnSet = new ColumnSet("fullname", "contactid")
    qe.Criteria.AddCondition("contactid", ConditionOperator.In, list.Cast<Object>().ToArray());
    qe.Distinct = true;

    var results = service.RetrieveMultiple(qe).Entities.Select (e => e.ToEntity<Contact>()).
        Select(x => new UserInformationProxy()
        {
            FullName = x.FullName,
            Id = x.ContactId
        });

    return results;
}

在旁注中,每個聯系人必須具有非空的ID,因此無需檢查它。

編輯:使用單個查詢可以完成,Daryl使用正確的代碼發布了答案。

其他(不那么聰明)的替代方案是:

  1. 檢索所有記錄並檢查Guids后
  2. 為每個Guid做一次檢索

因為只有40條記錄,我建議使用后期綁定來檢索記錄,以便選擇最小的ColumnSet。

與此問題相關的有用鏈接:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM