我希望使用实体框架将Expression<Func<DTOItem, bool>> predicate
转换为Expression<Func<Item, bool>> predicate
,其中DTOItem
是实体的映射类,Item
(数据库中的表)是实体框架工作类。< / p>
IDTOItemRepository itemRepo = new DTOItemRepository();
DTOItem itemObject = itemRepo.Single(q => q.ItemID == 1 && q.ItemType == 1);
其中q => q.ItemID == 1 && q.ItemType == 1
的类型为Expression<Func<DTOItem, bool>>
。
现在我需要将此表达式转换为Expression<Func<Item, bool>>
答案 0 :(得分:0)
使用AutoMapper及其Queryable Extensions部分,它将完全适合您(但不是直接)。它的作用是让你将IQueryable<Item>
变成IQueyable<DtoItem>
,这样就可以使用Expression<Func<DTOItem, bool>>
,然后当你去执行查询时,后备存储AutoMapper会转换{ {1}}分配到Expression<Func<DTOItem, bool>>
部分以传递给EF提供商。
Expression<Func<Item, bool>>
答案 1 :(得分:0)
你做不到。你可以很容易地做到相反。
让我们来看看另一个例子。
我保证,如果你给我一个苹果,我可以告诉你它是否仍然新鲜。我知道关于每一种苹果的一切。
您如何利用我的知识来确定任何一块水果是否仍然新鲜?你不能。我知道苹果,但我不知道其他类型的水果。我不能保证,如果你给我任何种类的水果,我会知道它是否新鲜。
现在如果要求您确定是否有任何类型的红美味苹果新鲜怎么办?您是否可以使用我可以提供给您的信息在所有情况下?你当然可以。我可以处理任何类型的苹果,将你的问题仅限于一种对我来说没问题。
你有一个知道如何获取任何DTOItem并返回布尔值的函数。您不能使用它来取一个Item并返回一个布尔值,因为如果该项不是DTOItem怎么办?那你会怎么做?但是如果你有一个方法可以接受任何项目并返回一个布尔值,那么你可以“假装”它只接受DTOItems。它可以处理任何项目,限制它只是DTOItems的输入不是问题。