使用 Entity Framework 在 C# 中出现 LINQ 问题
LINQ troubles in C# using Entity Framework
我有几个 table,这就是我需要实现的目标。
这从一个 table
中获取所有行
var FRA = from prod in _cctDBContext.Fra
where prod.ActTypeId == 1
从中,我得到了 ActTypeID
.
的所有行
然后我需要查询另一个 table,ID 是从那个
得到的
foreach (var item in FRA)
{
var FRSA = _cctDBContext.Frsa
.Select(p => new { p.Fraid, p.Frsa1,
p.Frsaid, p.CoreId,
p.RelToEstId, p.ScopingSrc,
p.Mandatory })
.Where(p => p.Fraid == item.Fraid)
.ToList();
}
然后我需要将其中的每一个推送到 Entity Framework。我通常这样做:
foreach (var item in FRA)
{
var FinanicalReportingActivity = new FinancialReportingActivity { FinancialReportingActivityId = item.Fraid, ScopingSourceType = item.ScopingSrc, Name = item.Fra1, MandatoryIndicator = item.Mandatory, WorkEffortTypeId = 0 };
_clDBContext.FinancialReportingActivity.AddRange(FinanicalReportingActivity);
}
但是因为我为每个循环使用了 2 个,所以我无法让变量工作,因为我找不到将局部变量作为实体上下文的方法。
谁能想到更好的编码方式?
谢谢
您似乎正在从一个数据库的一组实体中加载数据,并希望在另一个数据库中创建匹配的相似实体。
导航属性在这里会有很大帮助。 Frsa 似乎是 Fra 下的一个子集合,因此这可能(如果还没有)连接为 Fra 实体中的一个集合:
那么您只需要进行一次查询就可以访问每个 Fra 及其关联的 Frsa 详细信息。在您的情况下,您看起来对相关的 FRSA 详细信息更感兴趣以填充此 ReportingActivity:
var details = _cctDBContext.Fra
.Where(x => x.ActTypeId == 1)
.SelectMany(x => x.Frsa.Select(p => new
{
p.Fraid,
p.Frsa1,
p.Frsaid,
p.CoreId,
p.RelToEstId,
p.ScopingSrc,
p.Mandatory
}).ToList();
尽管如果关系是双向的,其中 Fra 包含 Frsa,而 Frsa 包含对 Fra 的引用,那么这可以简化为:
var details = _cctDBContext.Frsa
.Where(x => x.Fra.ActTypeId == 1)
.Select(p => new
{
p.Fraid,
p.Frsa1,
p.Frsaid,
p.CoreId,
p.RelToEstId,
p.ScopingSrc,
p.Mandatory
}).ToList();
其中任何一个都应该为您提供 FRSA 的详细信息以填充您的报告实体。
看起来您可以将其作为单个连接执行此操作:
var query =
from prod in _cctDBContext.Fra
where prod.ActTypeId == 1
join p in _cctDBContext.Frsa on prod.Fraid equals p.Fraid
select new
{
p.Fraid,
p.Frsa1,
p.Frsaid,
p.CoreId,
p.RelToEstId,
p.ScopingSrc,
p.Mandatory
};
我有几个 table,这就是我需要实现的目标。
这从一个 table
中获取所有行var FRA = from prod in _cctDBContext.Fra
where prod.ActTypeId == 1
从中,我得到了 ActTypeID
.
然后我需要查询另一个 table,ID 是从那个
得到的foreach (var item in FRA)
{
var FRSA = _cctDBContext.Frsa
.Select(p => new { p.Fraid, p.Frsa1,
p.Frsaid, p.CoreId,
p.RelToEstId, p.ScopingSrc,
p.Mandatory })
.Where(p => p.Fraid == item.Fraid)
.ToList();
}
然后我需要将其中的每一个推送到 Entity Framework。我通常这样做:
foreach (var item in FRA)
{
var FinanicalReportingActivity = new FinancialReportingActivity { FinancialReportingActivityId = item.Fraid, ScopingSourceType = item.ScopingSrc, Name = item.Fra1, MandatoryIndicator = item.Mandatory, WorkEffortTypeId = 0 };
_clDBContext.FinancialReportingActivity.AddRange(FinanicalReportingActivity);
}
但是因为我为每个循环使用了 2 个,所以我无法让变量工作,因为我找不到将局部变量作为实体上下文的方法。
谁能想到更好的编码方式?
谢谢
您似乎正在从一个数据库的一组实体中加载数据,并希望在另一个数据库中创建匹配的相似实体。
导航属性在这里会有很大帮助。 Frsa 似乎是 Fra 下的一个子集合,因此这可能(如果还没有)连接为 Fra 实体中的一个集合:
那么您只需要进行一次查询就可以访问每个 Fra 及其关联的 Frsa 详细信息。在您的情况下,您看起来对相关的 FRSA 详细信息更感兴趣以填充此 ReportingActivity:
var details = _cctDBContext.Fra
.Where(x => x.ActTypeId == 1)
.SelectMany(x => x.Frsa.Select(p => new
{
p.Fraid,
p.Frsa1,
p.Frsaid,
p.CoreId,
p.RelToEstId,
p.ScopingSrc,
p.Mandatory
}).ToList();
尽管如果关系是双向的,其中 Fra 包含 Frsa,而 Frsa 包含对 Fra 的引用,那么这可以简化为:
var details = _cctDBContext.Frsa
.Where(x => x.Fra.ActTypeId == 1)
.Select(p => new
{
p.Fraid,
p.Frsa1,
p.Frsaid,
p.CoreId,
p.RelToEstId,
p.ScopingSrc,
p.Mandatory
}).ToList();
其中任何一个都应该为您提供 FRSA 的详细信息以填充您的报告实体。
看起来您可以将其作为单个连接执行此操作:
var query =
from prod in _cctDBContext.Fra
where prod.ActTypeId == 1
join p in _cctDBContext.Frsa on prod.Fraid equals p.Fraid
select new
{
p.Fraid,
p.Frsa1,
p.Frsaid,
p.CoreId,
p.RelToEstId,
p.ScopingSrc,
p.Mandatory
};