2013-05-22 63 views
1
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中加入靜態引導?Linq加入靜態引導

這是我的linq聲明。當我運行這個查詢時,我得到了excel。如何將靜態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(); 
+0

您可以先顯示您的(初步)linq聲明嗎?從SQL代碼很難回答這個問題。 –

+0

我編輯了問題 –

回答

0

這是不完全清楚你ContactSet如何連接到您的查詢等多套,但你可以通過在join代替使用where解決這個問題:

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)短FO r Where(x => x.ContactId == guid).FirstOrDefault()

+0

感謝Gert。讓關鍵字是我的解決方案:) –

0

有在C#語言中沒有的Guid文字,所以你必須使用Guid.Parse,這在我的LINQ的測試工作到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"); 
+0

感謝您的回覆,但我得到了同樣的錯誤 –