例外是正常的,因为通过反射获取属性显然无法转换为 SQL。
我会尝试的一件事是创建一个通用接口,该接口公开Id
给定类型的属性:
public interface HasId<T> {
T Id { get; set; }
}
现在您可以将您的实体声明为 implementation HasId<int>
,例如,如果Id
是 type int
。
下一步是修改您的方法,如下所示:
public static IEnumerable<T> GetModified<TId, T>
(IQueryable<T> objects, TId[] ids) where T : class, HasId<TId>
{
return objects.Where(j => ids.Contains(j.Id));
}
请注意添加的通用限制:where T : class, HasId<TId>
. 这使您能够编写j.Id
返回TId
值的简化的 ,而不是诉诸反射。
请注意,我没有运行或测试过这段代码;这只是我看到您的问题时得到的一个想法,希望对您有所帮助。
更新:
这是另一种可能的解决方案,它不需要您声明接口或以任何方式更改您的类:
public static IEnumerable<T> GetModified<TId, T>
(IQueryable<T> objects, TId[] ids, Expression<Func<T, TId>> idSelector)
where T : class
{
return objects.Where(j => ids.Contains(idSelector(j)));
}
我在这里所做的是添加Expression<Func<T, TId>> idSelector
参数,一个可以返回Id
给定实例的表达式T
。
你会这样调用方法:
var modified = GetModified(dbObjects, yourIdArray, entity => entity.Id);
(只有第三个参数是新的;保持其他参数不变)。
同样,我还没有测试这是否有效甚至可以编译,因为我这里没有带 VS 的计算机 :(。