Entity framework 获取嵌套数据并使用嵌套DTO将其锐化为DTO
我是EF、Linq和C的新手,我一直在开发以下产品。 我无法将数据映射到这样的结构中: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
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转换为匿名类型有冲突。