在LINQ查询中使用组
我正在使用LINQ to CRM提供商 我正在查询信息,然后使用LINQ查询LINQ到CRM查询,这样我就可以使用GroupBy,因为LINQ到CRM提供商不支持它。这就是我目前所拥有的在LINQ查询中使用组,linq,dynamics-crm,dynamics-crm-2011,Linq,Dynamics Crm,Dynamics Crm 2011,我正在使用LINQ to CRM提供商 我正在查询信息,然后使用LINQ查询LINQ到CRM查询,这样我就可以使用GroupBy,因为LINQ到CRM提供商不支持它。这就是我目前所拥有的 var linqQuery = (from r in orgServiceContext.CreateQuery("opportunity") join c in orgServiceContext.CreateQuery("contact") on ((EntityReference
var linqQuery = (from r in orgServiceContext.CreateQuery("opportunity")
join c in orgServiceContext.CreateQuery("contact") on
((EntityReference)r["new_contact"]).Id equals c["contactid"] into opp
from o in opp.DefaultIfEmpty()
select new
{
OpportunityId = !r.Contains("opportunityid")
? string.Empty : r["opportunityid"],
CustomerId = !r.Contains("customerid")
? string.Empty : ((EntityReference)r["customerid"]).Name,
OwnerId = !r.Contains("ownerid")
? string.Empty : ((EntityReference)r["ownerid"]).Id.ToString(),
OwnerName = !r.Contains("ownerid")
? string.Empty : ((EntityReference)r["ownerid"]).Name.ToString(),
Priority = !r.Contains("opportunityratingcode")
? string.Empty : r.FormattedValues["opportunityratingcode"],
ContactName = !r.Contains("new_contact")
? string.Empty : ((EntityReference)r["new_contact"]).Name,
// ...
// other properties
});
var linqQuery2 = (from f in linqQuery.ToList()
group f by f.OwnerId into myGroup
select new
{
OrderCount = myGroup.Count()
});
但是我还希望能够从linqQuery2
查询linqQuery
中的其他变量
所以我想要的是:
var linqQuery2 = (from f in linqQuery.ToList()
group f by f.OwnerId into myGroup
select new
{
OwnerName = myGroup.OwnerName,
OrderCount = myGroup.Count()
});
var linqQuery2 = (from f in linqQuery.ToList()
group f by f.OwnerId into myGroup
select new
{
OwnerName = myGroup.First().OwnerName,
OrderCount = myGroup.Count()
});
这可能吗?试试看
var linqQuery2 = (from f in linqQuery.ToList()
group f by f.OwnerName
into myGroup
select new
{
OwnerName = myGroup.Key,
OwnerCount = myGroup.Count()
});
或者:
var linqQuery2 = linqQuery.ToList()
.GroupBy(f => f.OwnerName)
.Select(myGroup => new
{
OwnerName = myGroup.Key,
OwnerCount = myGroup.Count()
});
假设组中所有项目的所有者名称相同,则可以执行以下操作:
var linqQuery2 = (from f in linqQuery.ToList()
group f by f.OwnerId into myGroup
select new
{
OwnerName = myGroup.OwnerName,
OrderCount = myGroup.Count()
});
var linqQuery2 = (from f in linqQuery.ToList()
group f by f.OwnerId into myGroup
select new
{
OwnerName = myGroup.First().OwnerName,
OrderCount = myGroup.Count()
});
编辑:
如果要多次使用第一项,我建议您使用“let”操作符:
var linqQuery2 = (from f in linqQuery.ToList()
group f by f.OwnerId into myGroup
let first = myGroup.First()
select new
{
OwnerName = first.OwnerName,
OrderCount = myGroup.Count()
});
在使用此方法时,您需要确保多个所有者没有相同的名称。否则,您的分组将不正确。谢谢。不过,这不允许我从linqQuery中选择其他变量。谢谢,这似乎是可行的。如果我想从第一个查询中获取更多变量,比如“Notes”,我可以继续使用first()?当然可以,尽管每次调用first()或Count()都会导致对延迟的linq查询进行另一次计算。有关此问题的解决方案,请参阅“编辑”。是否有方法使其能够在组中搜索所有对象,而不仅仅是第一个值。比如说。它统计所有LeadShare变量的值为100000000。因此,如果我有10个拥有相同id的所有者,其中5个的LeadShare值为100000000,那么它给出了5个计数。现在,它似乎只是寻找第一个,如果它不匹配,它就会忽略其余的。谢谢也许最好为这个问题贴一个新问题。事实上,我还没有花很多时间在LINQ和CRM2011上。