Dynamic linqを使用してMVCアプリにデータを提供していますが、DateTimeフィールドに問題があります。
私が解析しているオブジェクトにはSystem.Datetimeフィールドがあり、日付が対応しているかどうかを確認したいと思います。
だから私はこのような文字列を構築しようとします(私は動的辞書を解析してデータを取得しています):
string dateToParse = keyValuePair.Value;
DateTime objDate = DateTime.Parse(dateToParse);
valuesToUse.Add("OBJ_DATE.Date == " + objDate.ToShortDateString());
データをロードするときは、次のようにします。
var objQry = from pl in m_Db.OBJS.Where(whereConditions)
select pl;
whereConditions
変数は、すべてのデータが揃ったときに作成する文字列です。
しかし、データが日時フィールドに到達すると、アプリは次のステートメントでクラッシュします。
Operator '==' incompatible with operand types 'DateTime' and 'Int32'
動的Linqを使用してDateTimeフィールドを確認するにはどうすればよいですか? ToShortDateStringなしでobjDateを配置するなど、多くのオプションを試しましたが、効果は同じです。
"OBJ_DATE.Date == 2012.01.01"、例えば
たぶん私は何かが足りないのですが、日付を引用符で囲むか、それを日付として扱うために何かをする必要はありませんか?動的Linqがどのように機能するかを思い出そうとしていますが、基準がプリミティブ型ではないことを拡張メソッドに伝える方法がいくつかあるはずです。
OBJ_DATE.Date == "2012.01.01"
更新 -ああハハハハハハハハハハ。 1つのインライン文字列としてではなく、拡張メソッドにパラメーターとして渡してみてください。思いついたのですが、それ以上の時間を過ごすことができませんでした。そのため、複数の式を組み合わせる方法を掘り下げて、質問で行うように動的に式を構築できるようにする必要があります。
public void Main()
{
var people = new List<Person>()
{
new Person(){Name = "Jpe", BirthDate =DateTime.Parse("March 18, 1980")},
new Person(){Name = "Bob", BirthDate =DateTime.Parse("July 22, 1989")},
new Person(){Name = "Sarah", BirthDate =DateTime.Parse("Nov 5, 1995")}
};
var firstExpression = System.Linq.Dynamic.DynamicExpression.ParseLambda<Person, bool>("BirthDate = @0", DateTime.Parse("July 22, 1989"));
//var secondExpression = System.Linq.Dynamic.DynamicExpression.ParseLambda<Person, bool>("Name = @0", "Nick");
//var finalExpression = Expression.And(firstExpression, secondExpression);
people.AsQueryable().Where(firstExpression).FirstOrDefault().Dump();
}
public class Person
{
public string Name{get;set;}
public DateTime BirthDate {get;set;}
}