如何在EF中转换谓词类型

时间:2013-11-18 22:01:34

标签: c# entity-framework lambda

我希望使用实体框架将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>>

2 个答案:

答案 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的输入不是问题。