我可以找到许多有关如何更改表达式主体的信息,但找不到任何有关如何更改ReturnType的信息。
这是我编写的代码,其中包含对下面给出的Convert例程的调用。
private T[] CheckCreatedOnDate<T>(Expression<Func<T, object>> fieldExpression, T[] input, Data.Context context) where T : Entity
{
var fieldDelegate = fieldExpression.Compile();
Expression<Func<T, bool>> predicateExpression = Convert(fieldExpression);
Func<T, bool> predicateDelegate = predicateExpression.Compile();
Predicate<T> predicate = predicateDelegate.Invoke;
DbSet<T> dbSet = context.Set<T>();
var data = dbSet.ToList();
foreach (T inputRecord in input)
{
var fieldObject = fieldDelegate.Invoke(inputRecord);
var dataRecord = data.SingleOrDefault(x => Equals(predicate, fieldObject));
if (dataRecord != null)
{
inputRecord.CreatedOn = dataRecord.CreatedOn;
}
}
return input;
}
此方法的行为应与EF中的AddOrUpdate方法非常相似,但是,如果记录已存在于Db中,则此方法将仅替换createdOn日期。
但是,我的代码仍然无法正常工作。创建的谓词似乎不正确,因为它从未在Db中找到相关记录。
所有帮助,不胜感激。
干杯迈克
假设这fieldExpression
就像(T e) => e.Field
我得出的结论,即您希望在DB记录中找到具有相同Field
列值的东西。
试试这个:
foreach (T inputRecord in input)
{
object fieldObject = fieldDelegate.Invoke(inputRecord);
ParameterExpression p = fieldExpression.Parameters.First();
// Equivalent to x => x.Field == fieldObject
Expression<Func<T, bool>> predicate = Expression.Lambda<Func<T, bool>>(
// input.Field == fieldObject
Expression.Equal(
// input.Field
fieldExpression.Body,
// constant from fieldObject
Expression.Constant(fieldObject)
),
new []{ p }
);
T dataRecord = dbSet.SingleOrDefault(predicate);
if (dataRecord != null)
{
inputRecord.CreatedOn = dataRecord.CreatedOn;
}
}
我通过获取fieldExpression
body在每个循环中创建一个全新的谓词,并将其传递给SingleOrDefault
调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句