簡體   English   中英

內聯特定SQL查詢到Linq C#

[英]Inner Join in Specific Sql Query to Linq C#

如何將此sql轉換為Csharp linq代碼?


Select * From CsRecognitions Where Id = 499

Select * From CsRecognitionNodes RN
Inner Join CsTreeNodes TN ON RN.NodeId = TN.Id
Where RecognitionId = 499

這些是我的課程;


    [Table("CsRecognitions")]
    public class Recognition : Entity
    {
        public virtual Tree Tree { get; set; }

        public virtual int? TreeId { get; set; }

        public virtual Tree MainTree { get; set; }

        public virtual int? MainTreeId { get; set; }

        public virtual ICollection Nodes { get; set; }

        //...
    }

    [Table("CsTreeNodes")]
    public class TreeNode : FullAuditedEntity
    {
        public virtual int TreeId { get; set; }

        [ForeignKey("TreeId")]
        public virtual Tree Tree { get; set; }

        public virtual int? MainNodeId { get; set; }

        //...
    }

    [Table("CsRecognitionNodes")]
    public class RecognitionNode : Entity
    {
        public virtual long RecognitionId { get; set; }

        [ForeignKey("NodeId")]
        public virtual TreeNode Node { get; set; }

        public virtual int NodeId { get; set; }

        [ForeignKey("MainNodeId")]
        public virtual TreeNode MainNode { get; set; }

        public virtual int MainNodeId { get; set; }

        //...
    }

這是我當前的解決方案...但是,如您所見,如果query.ToList()將獲得太多項目,程序將變得越來越慢...

if (input.TreeNodeId.HasValue)
{
    List<long> recognitionNodeIds = _recognitionNodeRepository.GetAll()
                 .Where(rn => rn.CreationTime >= input.StartDate && rn.MainNodeId == input.TreeNodeId.Value)
                 .Select(recognitionNode => recognitionNode.RecognitionId)
                 .ToList();

    List<Recognition> recognitions = query.ToList();

    // recognitions count may be up to 300,000 etc...
    foreach (Recognition recognition in recognitions)
    {
        if (recognitionNodeIds.Contains(recognition.Id))
        {
              recognitionsFiltered.Add(recognition);
        }
    }

    actualResult = recognitionsFiltered;
}

@UPDATE 1:這是我到目前為止所做的;


                //var asd = _recognitionNodeRepository.GetAll().Join(_treeNodeRepository.GetAll(), x => x.NodeId, y => y.Id, (x, y) => new
                //                                                                                          {
                //                                                                                              RecognitionNode = x,
                //                                                                                              TreeNode = y
                //                                                                                          }).Where(x => x.RecognitionNode.RecognitionId == 9);
//first line: 
recognitions.Where(r => r.Id == 499)
//second line, handwritten so don't take it word for word
CsRecognitionNodes.Join(CsTreeNodes, x => x.NodeId, y => y.Id, (x, y) => new { CsRecognitionNodes = x, CsTreeNodes = y}).Where(x => x.CsRecognitionNodes.RecognitionId == 499);

對於當前的解決方案,請考慮將識別節點ID轉換為HashSet

當您使用哈希集進行包含時,訪問時間將是恆定的。 現在,通過您的List,您將遍歷所有RecognitionNodeIds以尋找identification.Id,這肯定會使事情變慢(在foreach循環中循環)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM