Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Entity framework 获取嵌套数据并使用嵌套DTO将其锐化为DTO_Entity Framework_Linq_Dto - Fatal编程技术网

Entity framework 获取嵌套数据并使用嵌套DTO将其锐化为DTO

Entity framework 获取嵌套数据并使用嵌套DTO将其锐化为DTO,entity-framework,linq,dto,Entity Framework,Linq,Dto,我是EF、Linq和C的新手,我一直在开发以下产品。 我无法将数据映射到这样的结构中: Id, Actions [ Action1, Action2, Action3 ] public class TestDTO { public int TestId { get; set; } public TestDTO2[] Actions { get; set; } } public IQueryable<TestDTO> GetNested(Filt

我是EF、Linq和C的新手,我一直在开发以下产品。 我无法将数据映射到这样的结构中:

Id,
Actions [
  Action1,
  Action2,
  Action3
]
public class TestDTO
{
    public int TestId { get; set; }
    public TestDTO2[] Actions { get; set; }
}
    public IQueryable<TestDTO> GetNested(Filter filter)
    {
        var query =
                    from a in db.Table1.AsQueryable()
                    select new TestDTO
                    {
                        TestId = a.Id,
                        Actions = (
                            from b in db.Table2.AsQueryable()
                            where a.Id == b.TestId 
                            select new TestDTO2
                            {
                                TestActionId = b.TestActionId,
                                StartDate = b.StartDate
                            }
                        ).ToArray()
                    };
        return query;
    }
我有两个DTO类,如下所示:

Id,
Actions [
  Action1,
  Action2,
  Action3
]
public class TestDTO
{
    public int TestId { get; set; }
    public TestDTO2[] Actions { get; set; }
}
    public IQueryable<TestDTO> GetNested(Filter filter)
    {
        var query =
                    from a in db.Table1.AsQueryable()
                    select new TestDTO
                    {
                        TestId = a.Id,
                        Actions = (
                            from b in db.Table2.AsQueryable()
                            where a.Id == b.TestId 
                            select new TestDTO2
                            {
                                TestActionId = b.TestActionId,
                                StartDate = b.StartDate
                            }
                        ).ToArray()
                    };
        return query;
    }

我已将对DB的调用分离到名为BusinessLogic的文件中,我是这样做的:

Id,
Actions [
  Action1,
  Action2,
  Action3
]
public class TestDTO
{
    public int TestId { get; set; }
    public TestDTO2[] Actions { get; set; }
}
    public IQueryable<TestDTO> GetNested(Filter filter)
    {
        var query =
                    from a in db.Table1.AsQueryable()
                    select new TestDTO
                    {
                        TestId = a.Id,
                        Actions = (
                            from b in db.Table2.AsQueryable()
                            where a.Id == b.TestId 
                            select new TestDTO2
                            {
                                TestActionId = b.TestActionId,
                                StartDate = b.StartDate
                            }
                        ).ToArray()
                    };
        return query;
    }
我发现以下错误:


LINQ to Entities无法识别“Project.Core.Models.TestDTO2[]ToArrayTestDTO2”方法,并且此方法无法转换为存储表达式。

您无法准确执行此查询,最好进行两个简单查询,然后在客户端处理其结果:

var main = db.Table1.Select(x => new { x.Id, x.Title }).ToList();
var mainIds = main.Select(x => x.Id).ToList();
var actions = db.Table2.Where(x => mainIds.Contains(x.TestId)).Select(x => new 
{ 
    x.TestId,
    x.TestActionId, 
    x.StartDate
}).ToList();

var result = main.Select(x => {
    var actions = actions.Where(y => y.TestId == x.Id).Select(y => new TestDTO2
                  {
                      TestActionId = y.TestActionId,
                      StartDate = y.StartDate
                  }).ToArray();
    return new TestDTO 
    { 
        TestId = x.Id, 
        Title = x.Title, 
        Actions = actions.Length == 0 ? null : actions
    };
}).ToList();

是的,您不能使用任何不能在EF中转换sql的c方法。 事实上,你需要得到一个列表,然后把它隐藏到你的DTO中

 db.Table1
   .Join(db.Table2,
   a => a.Id,
   b => b.TestId,
   (a, b) => new
   {
      a.Id,
      b
   })
   .GroupBy(k => k.Id, v => v).ToList()
   .Select(a=>new TestDTO
       {
         TestId = a.Id,
         Actions = a.Select(b=>
         new TestDTO2
           {
              TestActionId = b.TestActionId,
              StartDate = b.StartDate
           }.ToArray()
         }).ToList()

大家好:TestId=a.Id,我得到了一个错误,a没有暴露任何属性。谢谢,这是我需要的完美工作方式。例如,如果我没有匹配的操作,我仍然有空的TestDTO2数组。有可能省略它吗?以及如何使用更多属性填充main。谢谢。如果我在这里添加新属性:var main=db.Table1.Selectx=>new{x.Id,x.Title}.ToList;然后我在第行收到错误消息:var actions=db.Table2.Wherex=>main.Containsx.TestId。。。main.Contains与将int转换为匿名类型有冲突。