1

今日のすべての誕生日を取得するLinqクエリを作成する方法を知っている人はいますか?以下のコードは機能しません:

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

次のようなエラーが発生します:

「無効な'where'条件。エンティティメンバーが無効なプロパティまたはメソッドを呼び出しています。」

前もって感謝します!

4

5 に答える 5

4

ベンダーが誕生日を見つけるのと同じくらい簡単なことを行う方法について4部構成のブログシリーズを書くときはいつでも(Microsoftが2007年に行ったように)、これは簡単ではないことを知っておく必要があります。私の知る限り、これはそれ以来更新されていません。

したがって、選択肢は限られています。

  1. プラグインを介して連絡先が作成または更新されるたびに更新される、のような新しいフィールドを作成し、それらのフィールドをクエリnew_birthmonthします。new_birthdayint
  2. Dynamic Linqを使用して、誕生日が妥当な範囲の年(たとえば、長肝臓の場合は140)に該当するかどうかを確認する句を句に作成します(以下のコードOR)。WHERE
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();
于 2012-04-13T18:09:43.343 に答える
2

「PeterMajeed」の例と「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();

上記のクエリで正しい結果が得られました。私を助けてくれたすべての人に感謝します!

于 2012-04-16T14:38:29.360 に答える
1

c.BirthDateがnull許容の場合は、最初にそれを日時に変換する必要があります。

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();
于 2012-04-13T15:18:33.290 に答える
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>());
}

フィルタ+条件について他の演算子を調査することをお勧めします

于 2012-04-13T18:53:27.513 に答える
0

QueryExpressionを使用できます(Microsoft CRMプラグインで機能します)

public EntityCollection getBirthdateList(IOrganizationService orgsService)
    {
        List<string> birthdays = new List<string>(); 

        //makes sure no CRM unsupported dates are passed (less than 1/1/1900)
        for (int i = Math.Min(140, DateTime.Today.Year - 1930); i > -1; i--)
        {
            //adds a different date per year
            birthdays.Add
            (
                DateTime.Now.AddYears(-i).ToString("yyyy-MM-dd")
            ); 
        }

       
        // Instantiate QueryExpression 
        var query = new QueryExpression("contact");

        // Define filter QEquote.Criteria
        var queryfilter = new FilterExpression();
        query.Criteria.AddFilter(queryfilter);

        // Define filter 
        queryfilter.FilterOperator = LogicalOperator.Or;
        queryfilter.AddCondition("birthdate",ConditionOperator.In,birthdays.ToArray());
        return orgsService.RetrieveMultiple(query); ;
    }
于 2020-12-09T04:50:10.590 に答える