使用 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
    };