【问题标题】:LINQ to SQL and LINQ to Entity Join with static AND conditionLINQ to SQL 和 LINQ to Entity Join 与静态 AND 条件
【发布时间】:2019-09-06 14:40:34
【问题描述】:

我正在尝试将以下 Join 语句转换为 LINQ TO SQL 或 LINQ to Entity。我知道如何在任一实现中加入表格;但是,我正在努力处理Join 语句中的AND 子句。

SELECT DISTINCT
    p.LastName, 
    p.FirstName
FROM
    dbo.Patient p INNER JOIN dbo.FormPat fp ON p.PatientID = fp.PatientID
    INNER JOIN dbo.TxCyclePhase tcp ON fp.TxCyclePhase = tcp.TxCyclePhaseID AND tcp.Type = 2

就 LINQ to SQL 而言,我有以下几点:

 var query = (from p in Context.Set<Patient>().AsNoTracking()
        join fp in Context.Set<PatientForm>().AsNoTracking() on p.Id equals fp.PatientId
        join tcp in Context.Set<TxCyclePhase>().AsNoTracking() on new { fp.TxCyclePhaseId, seconProperty = true } equals new { tcp.Id, seconProperty = tcp.Type == 2 }
        select new
        {
            p.FirstName,
            p.LastName,

        }).Distinct();

但是,我在第二个 join 语句中收到了 ArgumentNullException

对于 LINQ to Entity,我有以下内容,但是,这给了我一个独特的 IQueryableFormPat,而不是 Patient

var patients = Context.Set<Patient>().AsNoTracking()
                .SelectMany(p => p.Forms)
                .Where(fp => fp.Phase.Type == 2)
                .Distinct();

【问题讨论】:

  • 我想我的SQL to LINQ Recipe 会帮助你。在这种情况下,规则 6:在连接 equals 的每一侧创建一个匿名对象。

标签: c# entity-framework linq linq-to-sql linq-to-entities


【解决方案1】:

就 LINQ to Entity 而言,我能够弄清楚。我仍然想知道如何在 LINQ to SQL 中做到这一点。

我正在使用EF fluent API。我的Patient 对象看起来像:

public Patient()
        {
            Programs = new HashSet<Program>();
        }
        public virtual ICollection<PatientForm> Forms { get; set; }

我的PatientForm 对象看起来像:

public class PatientForm
    {
        public int FormId { get; set; }
        public Patient CurrentPatient { get; set; }
        public TxCyclePhase Phase { get; set; }
    }

CyclePhase 对象看起来像:

public TxCyclePhase()
        {
            this.FormPats = new HashSet<PatientForm>();
        }

        public int Id { get; set; }
        public virtual ICollection<PatientForm> FormPats { get; set; }

在实体配置中,我设置了关系。因此,在存储库中,我所要做的就是在选择Patient 表单时使用Any() 函数。

var patients = Context.Set<Patient>().AsNoTracking()
                .Where(p => p.Forms.Any(f => f.Phase.Type == 2))
                .Distinct();

【讨论】:

    猜你喜欢
    • 2011-09-13
    • 2016-11-24
    • 2021-08-12
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多