2012-04-13 5 views
1

Кто-нибудь знает, как сделать запрос Linq, который получает все дни рождения сегодня? Приведенный ниже код не работает:Как получить все дни рождения сегодня?

var getBirthdays = 
    orgContext.CreateQuery<Contact>() 
       .Where(c => c.BirthDate != null 
          && c.BirthDate.Value.Month == DateTime.Now.Month).ToList(); 

Я получаю сообщение об ошибке, как это:

"Invalid 'where' condition. An entity member is invoking an invalid property or method."

Спасибо заранее!

+1

Есть Дата рождения.Состояние DateTime? –

+0

Да, но проблема в том, что мы не можем получить к ней доступ через LINQ в CRM 2011 .. 100% уверены, что Birthdate.Value является adatetim. – Freeetje

+1

Так что его отказ, как в .Value, не является доступным свойством? Какова фактическая ошибка? Что конкретно не работает? –

ответ

2

Я решил свою проблему на примере из "Питера Маджид" и с помощью "LinqKit"!

var predicate = PredicateBuilder.False<Contact>(); 
for (int i = Math.Min(140, DateTime.Today.Year - 1900); i > -1; i--) 
{ 
    DateTime cleanDateTime = new DateTime(DateTime.Today.AddYears(-i).Year, DateTime.Today.AddYears(-1).Month, DateTime.Today.AddYears(-i).Day); 
    predicate = predicate.Or(p => p.BirthDate == cleanDateTime.ToUniversalTime()); 
} 
var getBirthdays = (from c in orgContext.CreateQuery<Contact>().AsExpandable().Where(predicate) 
        select c).ToList(); 

Вышеуказанный запрос дал мне правильный результат! Thx всем, кто помог мне!

+2

Как любезность всем тем, кто нашел время, чтобы помочь, и их ответы были действительно полезными, пожалуйста, подумайте над тем, чтобы ответить на их ответы. –

+2

Я этого не знал :) Я сделаю это! – Freeetje

+0

При попытке этого получить эту ошибку: Исключение типа «System.ServiceModel.FaultException'1» произошло в Microsoft.Xrm.Sdk.dll, но не было обработано в коде пользователя. Дополнительная информация: Общая ошибка SQL. – SsjCosty

1

Если c.BirthDate обнуляемым, вы должны преобразовать его в DateTime первый:

var getBirthdays = orgContext.CreateQuery<Contact>() 
          .Where(c => c.BirthDate != null && 
            (Convert.ToDateTime(c.BirthDate).Month == 
             DateTime.Now.Month) && 
             Convert.ToDateTime(c.BirthDate).Day == 
             DateTime.Now.Day)) 
          .ToList(); 
+0

Протестировано, дает ту же ошибку, что и описанную выше: «Недействительный параметр« где ». Член сущности вызывает недопустимое свойство или метод.« – Freeetje

+0

Я не могу сделать это общедоступным, свойство исходит из« CRM ». Я не могу изменить его свойства ... – Freeetje

+1

Ах, странности провайдера CRM Linq. –

4

Anytime продавец записывает ряд блога четыре части о том, как сделать что-то же просто, как найти свой день рождения (как Microsoft в 2007 году), вы должны знать, что это будет непросто. Насколько я могу судить, это не обновлялось с тех пор.

Таким образом, вы ограничены варианты:

  1. Сделать новые поля называют что-то вроде new_birthmonth и new_birthday, который обновляется каждый раз, когда создается контакт или обновляется через плагин, и затем запросите данные поля int.
  2. Используя , создайте пункт OR в вашем пункте WHERE, который проверяет, подходит ли день рождения в разумные сроки (например, 140 для долгожителей) (код ниже).
List<string> birthdays = new List<string>(); //will contain list of OR clauses 

//makes sure no CRM unsupported dates are passed (less than 1/1/1900) 
for (int i = Math.Min(140, DateTime.Today.Year - 1900); i > -1; i--) 
{ 
    //adds a different date per year 
    birthdays.Add 
    (
     string.Format 
     (
      //DateTimes are stored in UTC 
      "BirthDate = DateTime.Parse(\"{0}\")", 
      DateTime.Today.ToUniversalTime().AddYears(-i) 
     ) 
    ); 
} 

//completes the correct dynamic linq OR clause 
string birthdayList = string.Join(" OR ", birthdays); 

var getBirthdays = orgContext.CreateQuery<Xrm.Contact>() 
    .Where(c => c.BirthDate != null) 
    .Where(birthdayList) 
    .ToList(); 
+0

Поставщик LINQ может быть совершенно бесит. Мои фавориты: ToLower() и Count() также дают то же NotImplementedException – glosrob

+0

@glosrob: Согласовано: вы всегда должны иметь полный доступ к * вашим * данным. О, хорошо, по крайней мере, следующий накопительный пакет обновлений звучит неплохо. –

+0

Будет ли эта проблема быть решен в следующем сводке обновлений CRM? Я попробую и дам вам знать, если я заработал! – Freeetje

1

Вы могли бы принести эту информацию с помощью запросов, если это возможно в вашей ситуации?

//set up the condition + filter 
var ce = new Microsoft.Xrm.Sdk.Query.ConditionExpression(); 
ce.Operator = Microsoft.Xrm.Sdk.Query.ConditionOperator.LastXDays; 
ce.AttributeName = "birthdate"; 
ce.Values.Add(30); 

var fe = new Microsoft.Xrm.Sdk.Query.FilterExpression(); 
fe.AddCondition(ce); 

//build query 
var query = new Microsoft.Xrm.Sdk.Query.QueryExpression(); 
query.EntityName = "contact"; 
query.Criteria.AddFilter(fe); 

//get results 
var results = CrmHelperV5.OrgProxy.RetrieveMultiple(query); 

//if you want early bound entities, convert here. 
var contacts = new List<Contact>(); 
foreach(var result in results.Entities) 
{ 
    contacts.Add(result.ToEntity<Contact>()); 
} 

You may want to investigate the other operators for the filters + conditions

0
orgContext.CreateQuery<Contact>().ToList<Contact>().Where... 
Смежные вопросы