首页 > 解决方案 > LINQ to SQL 和 LINQ to Entity Join 与静态 AND 条件

问题描述

我正在尝试将以下Join语句转换为 LINQ TO SQL 或 LINQ to Entity。我知道如何在任一实现中加入表格;但是,我正在为声明AND中的条款而苦苦挣扎Join

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();

但是,我收到了ArgumentNullException第二个加入声明。

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

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

标签: c#entity-frameworklinqlinq-to-sqllinq-to-entities

解决方案


就 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; }

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

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

推荐阅读