Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在EF中的谓词类型之间转换_C#_Entity Framework_Lambda - Fatal编程技术网

C# 如何在EF中的谓词类型之间转换

C# 如何在EF中的谓词类型之间转换,c#,entity-framework,lambda,C#,Entity Framework,Lambda,我想用实体框架将表达式谓词转换为表达式谓词,其中DTOItem是实体的映射类,项(数据库中的一个表)是实体框架工作类 IDTOItemRepository itemRepo = new DTOItemRepository(); DTOItem itemObject = itemRepo.Single(q => q.ItemID == 1 && q.ItemType == 1); 其中q=>q.ItemID==1&&q.ItemType==1属于表达式类型。 现

我想用实体框架将
表达式谓词
转换为
表达式谓词
,其中
DTOItem
是实体的映射类,
(数据库中的一个表)是实体框架工作类

   IDTOItemRepository itemRepo = new DTOItemRepository();
   DTOItem itemObject = itemRepo.Single(q => q.ItemID == 1 && q.ItemType == 1);
其中
q=>q.ItemID==1&&q.ItemType==1
属于
表达式类型。
现在,我需要将这个表达式转换为
表达式
使用它的一部分,它将为您准确地执行此操作(但不是以直接方式)。它的作用是让您将
IQueryable
转换为
IQueyable
,这样您就可以在其上使用
表达式
,然后当您再次执行查询时,后台存储自动映射器将
表达式
部分转换为
表达式
部分,以传递给EF提供者

public static void Main(string[] args)
{
     //This needs to be done once when your program starts up.
     //You may need to do a more complicated "CreateMap" depending on how Item and DTOItem relate.
     Mapper.CreateMap<Item, DTOItem>();

     RunMyProgram();
}

public DTOItem GetItem()
{

     using (var context = new MyDatabaseContext())
     {
         IQueryable<Item> itemQuery = context.Items;
         return itemQuery.Project().To<DTOItem>()
                         .Single(q => q.ItemID == 1 && q.ItemType == 1);
     }

     //the above translates to the equivalent code
     /*         
     return itemQuery.Where(q => q.itemid == 1 && q.itemtype == 1)
                     .Select(a => new ItemDTO {ItemID = a.itemid, ItemType = a.itemType, SomeType = a.sometype} )
                     .Single();
     */
}

public class DTOItem
{
    public int ItemID { get; set; }
    public int ItemType { get; set; }
    public String SomeType {get; set;}
}

public class Item
{
    public int itemid { get; set; }
    public string itemtype { get; set; }
    public String sometype {get; set;}
}

public class MyDatabaseContext: DbContext 
{
    public MyDatabaseContext(): base()
    {
    }
    public DbSet<Item> Items{ get; set; }
}
publicstaticvoidmain(字符串[]args)
{
//这需要在程序启动时执行一次。
//根据Item和DTOItem的关系,您可能需要执行更复杂的“CreateMap”。
CreateMap();
RunMyProgram();
}
公共数据项GetItem()
{
使用(var context=new MyDatabaseContext())
{
IQueryable itemQuery=context.Items;
将itemQuery.Project()返回到()中
.Single(q=>q.ItemID==1&&q.ItemType==1);
}
//上述代码转换为等效代码
/*         
返回itemQuery.Where(q=>q.itemid==1&&q.itemtype==1)
.Select(a=>newitemdto{ItemID=a.ItemID,ItemType=a.ItemType,SomeType=a.SomeType})
.Single();
*/
}
公共类数据项
{
公共int ItemID{get;set;}
公共int ItemType{get;set;}
公共字符串SomeType{get;set;}
}
公共类项目
{
公共int itemid{get;set;}
公共字符串itemtype{get;set;}
公共字符串sometype{get;set;}
}
公共类MyDatabaseContext:DbContext
{
公共MyDatabaseContext():base()
{
}
公共数据库集项{get;set;}
}

你不能。你可以很容易地做相反的事情

让我们看另一个例子

我保证如果你给我一个苹果,我可以告诉你它是否还新鲜。我对每一种苹果都了如指掌

你怎么能用我的知识来判断任何一块水果是否仍然新鲜?你不能。我知道苹果,但我不知道其他种类的水果。我不能保证,如果你给我任何一种水果,我都会知道它是否新鲜

现在,如果你被要求确定是否有任何类型的红色美味苹果是新鲜的呢?你能用我能给你的信息在所有情况下回答这个问题吗?当然可以。我可以处理任何类型的苹果,将你的问题限制在一种类型对我来说都没有问题


您有一个函数,它知道如何获取任何DTOItem并返回布尔值。您根本不能使用它获取一个项并返回一个布尔值,因为如果该项不是DTOItem怎么办?那你怎么办?但是,如果您有一个方法可以接受任何项并返回布尔值,那么您就可以“假装”它只接受dtoitem。它可以处理任何项目,将其输入仅限于数据项不是问题。

如果我们讨论该问题,而不是他们讨论的任何其他问题,这将更为合适。他们的观点是,你写问题的方式没有给我们足够的信息来回答,它只表明你想要一个免费的答案。请发布您尝试过的代码,以便为我们提供更好的问题背景。感谢您花时间编辑和改进您的问题,我已删除了我的否决票。这样它将从数据库中获取所有记录并应用筛选器,对吗?不,它不会获取所有记录,它将首先应用过滤器,然后仅从数据库中获取过滤后的记录(这是您想要的)。执行
((ObjectQuery)itemQuery).ToTraceString()
以查看它将生成的SQL。这是从实体框架上下文生成的。我已经再次更新了我的答案,以帮助详细说明。现在获取此错误时,mscorlib.dllWell中发生了类型为“System.StackOverflowException”的未处理异常,然后您做错了什么。您有一个指向自身的函数(我还从多线程使用的非线程安全集合中看到了它)。调试它,如果您不能理解它,请提出一个包含相关代码的新问题。