【问题标题】:How to do a LINQ query for count of entity whose owner == current user?如何对所有者 == 当前用户的实体计数进行 LINQ 查询?
【发布时间】:2018-11-20 00:26:08
【问题描述】:

我正在使用 Microsoft Dynamics CRM 2011 和 ADX Studios。在其中一个页面上,我正在尝试制作一个显示用户当前潜在客户数量的小部件。我想做一个 LINQ 查询,选择 CRM 数据库中潜在客户实体的所有者等于当前用户的潜在客户计数。我是 LINQ 的新手,所以我仍在尝试掌握查询的语义。到目前为止,我的代码如下所示,它吸引了所有潜在客户。我不太确定如何使用“where”子句检查所有者 ID 是否等于当前用户的 ID。

count = context.LeadSet.ToList().Count();

【问题讨论】:

  • 如何获取当前用户凭据?会是count = context.LeadSet.Count(lead => lead.OwnerId == currentUserId); 吗?您无需调用ToList 即可计算实体数量。 ToList 会将您的所有数据加载到内存中,这远非最佳,而Count 扩展方法会将 lambda 谓词转换为 SQL,它只会返回一个数字。
  • 首次加载站点时,用户凭据是通过 ADFS 输入的。我似乎无法获得获取 currentUserID 的正确方法。您的代码看起来可能有效,但它一直告诉我它无法解析“currentUserID”。另外作为旁注,我使用了“.ToList()”,因为我只使用“.Count”就收到了错误,并在crmconsultancy.wordpress.com/2011/06/06/… 上发现 CRM 2011 存在“.Count”问题,除非“.ToList”或 .AsEnumerable( )。

标签: c# linq dynamics-crm-2011


【解决方案1】:

this answer:

Linq to CRM 不支持任何聚合表达式,因此从性能角度来看,使用 Fetch XML 会更好。

【讨论】:

  • 真正重要的是,发现这个(它在谷歌上排名很好!)的每个人都明白为什么这是一个更好的答案。提供的链接很好地解释了。
【解决方案2】:

主要问题之一是查询还必须包含潜在客户的所有者。这是添加到 crm 的自定义字段。因此,ADX Studios 使用的 XRM 文件必须使用 CrmSvcUtil 重新构建。我使用了以下批处理文件,可以根据您的项目进行更改:

cd\"Program Files (x86)\Adxstudio\XrmPortals\6.0.0009\Framework"

CrmSvcUtil.exe /codeCustomization:"Microsoft.Xrm.Client.CodeGeneration.CodeCustomization, Microsoft.Xrm.Client.CodeGeneration" /url:https://contoso.com/XRMServices/2011/Organization.svc /username:user /password:password /out:"C:\Xrm.cs" /namespace:Xrm /servicecontextprefix:Xrm /servicecontextname:XrmServiceContext

pause

这必须以管理员身份运行才能完成新 XRM 文件的制作。然后必须将该文件复制并粘贴到 ADX Studio 解决方案中。重新构建解决方案,您的自定义字段现在将在您进行查询时被智能感知使用。

var context = new XrmServiceContext();
var leadList = (from a in context.LeadSet
                       where a.customFieldOwnerId.Id == Id
                       select a).ToList().Count();
                   int count = leadList;

要在使用 Microsoft Dynamics CRM 时获得计数,您必须.Count() 之前使用 .ToList()。 这似乎是多余的,但如果不这样做,您会收到错误。

【讨论】:

  • 这里值得注意的是 ToList() 的影响——尤其是对于像 Lead 这样的实体。我建议任何找到此答案的人查看@daryl 给出的答案。
【解决方案3】:

我不确定LeadSet 的数据结构,但我想是这样的:

context.LeadSet.Count(ls => ls.OwnerID == ownerId);

上面的内容提取了OwnerId 等于您的参数ownerId 的所有潜在客户的计数。

如果您想要匹配的对象,只需使用.Where 代替.Count

【讨论】:

【解决方案4】:

使用 lambda 表达式试试这个

int count = context.LeadSet.Where(a=>a.currentUserName==currentUserName").Count();

或 linq 查询语法

int count=(from item in context.LeadSet.ToList()
           where item.currentUserName==currentUserName
           select item).count();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    相关资源
    最近更新 更多