Linq加入静态guid

时间:2013-05-22 08:40:03

标签: linq left-join

select ca.Name,l.ListName,ci.EntityId,ci.EntityType,c.FullName from List l

inner join Contact c on c.ContactId = 'D48457AB-C0B5-E211-838F-000C29DFF60A'
inner join CampaignItem ci on ci.EntityId = l.ListId 
inner join Campaign ca on ca.CampaignId = ci.CampaignId
where l.CreatedFromCode = 2
and ci.EntityType = 4300

如何在Linq中加入静态guid?

这是我的linq声明。当我运行此查询时,我得到了超越。如何将静态Guid加入我的查询?

var list = (from li in context.ListSet
                        join lm in context.ListMemberSet on li.ListId.Value equals lm.ListId.Id
                        join c in context.ContactSet on lm.EntityId.Id equals on new Guid("D48457AB-C0B5-E211-838F-000C29DFF60A")
                        join ci in context.CampaignItemSet on li.ListId.Value equals ci.EntityId
                        join cam in context.CampaignSet on ci.CampaignId.Id equals cam.CampaignId.Value
                        select new
                        {
                            ListId = li.ListId,
                            ListType = li.Type,
                            MemberType = li.CreatedFromCode,
                            EntityType = lm.EntityType,
                            EntityId = lm.EntityId,
                            ContactNumber = c.trd_CustomerNumber,
                            CampaignRelatedEntity = ci.EntityType,
                            CampaignName = cam.Name == null ? string.Empty : cam.Name,
                            CampaignCode = cam.CodeName == null ? string.Empty : cam.CodeName,
                            Objective = cam.Objective == null ? string.Empty : cam.Objective,
                            CampaignType = cam.TypeCode == null ? string.Empty : ((FinansCrm.BusinessLibrary.Utils.XrmHelper.OptionSetInfo)XrmHelper.GetOption(service, Campaign.EntityLogicalName, "typecode", cam.TypeCode.Value)).Label,
                            BeginDate = cam.ActualStart == null ? string.Empty : cam.ActualStart.Value.ToString(),
                            EndDate = cam.ActualEnd == null ? string.Empty : cam.ActualEnd.Value.ToString(),
                            CampaignId = cam.CampaignId.Value
                        }).ToList()
                           .Where(p => p.ListType.Value.Equals(false) && p.EntityType.Equals(Contact.EntityLogicalName) &&
                                  p.MemberType.Value.Equals(Contact.EntityTypeCode) && p.ContactNumber.Equals(id) &&
                                  p.CampaignRelatedEntity.Equals(List.EntityLogicalName))
                         .ToList();

2 个答案:

答案 0 :(得分:0)

C#语言中没有Guid文字,因此您必须使用Guid.Parse,这在我的LINQ to SQL测试中有效

from l in List
join c in Contact on Guid.Parse("D48457AB-C0B5-E211-838F-000C29DFF60A") equals c.ContactId
join ci in CampaignItem ci on l.ListId equals ci.EntityId
join ca in Campaign on ci.CampaignId equals ca.CampaignId
where l.CreatedFromCode == 2 && ci.EntityType == 4300
select new {ca.Name,l.ListName,ci.EntityId,ci.EntityType,c.FullName}

这是一个天真的实现,可以对此查询进行优化。

作为一项额外的优化,您可以将Guid存储到班级中的静态只读变量,但是您必须在类型初始化时支付此价格

private static readonly Guid contactId = Guid.Parse("D48457AB-C0B5-E211-838F-000C29DFF60A");

答案 1 :(得分:0)

ContactSet如何与查询中的其他集相关联并不完全清楚,但您可以使用where代替join来解决此问题:

var guid = new Guid("D48457AB-C0B5-E211-838F-000C29DFF60A");

var list = (
  from li in context.ListSet
  join lm in context.ListMemberSet on li.ListId.Value equals lm.ListId.Id
  join ci in context.CampaignItemSet on li.ListId.Value equals ci.EntityId
  join cam in context.CampaignSet on ci.CampaignId.Id equals cam.CampaignId.Value
  let c = context.ContactSet.FirstOrDefault(x => x.ContactId == guid)
  select new
  { ...

伪装whereFirstOrDefault(x => x.ContactId == guid)Where(x => x.ContactId == guid).FirstOrDefault()的缩写。