![](/img/trans.png)
[英]Convert SQL Request to linq query c# (left outer join and inner join)
[英]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.