2

以下のような文字列式を形成しています。

     string Condition = " it.person_id = " + personId.ToString();

     if (lstPersonFields != null)
      {
         foreach (var field in lstPersonFields )
           {                           
              string  fieldCondition = " And it." + field.FieldName.ToString();
                if (field.FieldCondition == "Contains")
                  {
                    fieldCondition = fieldCondition + " Like '%" + field.FieldValue.ToString() + "%'";
                  }
                 else if (field.FieldCondition == "Equals")
                  {
                   fieldCondition = fieldCondition + " = '" + field.FieldValue.ToString()+"'";
                  }
                 Condition = Condition + fieldCondition;
           }
      }
      var personSearch = FullPersonlst.Where(Condition).ToList();

上記のコードは、同様の検索で日時値以外に対して正しく機能し、日時フィールドに対してエラーをスローします

Like arguments must be of string type 

日時フィールドを検索する方法は?

4

2 に答える 2

1

動的ラムダ式としてそれを行うには、次のようになります。

var arg = Expression.Parameter(typeof(Person), "it");
var body = Expression.Equal(
    Expression.PropertyOrField(arg, "PersonId"),
    Expression.Constant(personId));

if (lstPersonFields != null)
{
    foreach (var field in lstPersonFields)
    {
        var member = Expression.PropertyOrField(arg, field.FieldName);
        switch (field.FieldCondition)
        {
            case "Contains":
                body = Expression.AndAlso(body,
                    Expression.Call(typeof(SqlMethods), "Like", null,
                        member,
                        Expression.Constant("%" + field.FieldValue + "%")));
                break;
            case "Equals":
                body = Expression.AndAlso(body,
                    Expression.Equal(
                       member,
                       Expression.Constant(field.FieldValue)));
                break;
        }
    }
}
var lambda = Expression.Lambda<Func<Person,bool>>(body, arg);
var personSearch = FullPersonlst.Where(lambda).ToList();
于 2013-02-08T11:39:41.533 に答える
0

エラーが示すように、文字列以外の値のように使用しないでください。また、意味がありません。特定の日時を検索する場合は、datetime=valueを使用します。whitinを検索するために、その間で使用できる時間範囲を検索します。検索するプロパティのタイプを確認し、クエリにタイプを適合させる適切な方法を使用する必要があります。

個人的には、このような「動的クエリ作成者」を使用することはありません。

于 2013-02-08T11:33:17.280 に答える