【发布时间】:2014-11-17 15:49:19
【问题描述】:
如何将此 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;
}
@更新 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);
【问题讨论】:
-
你应该可以在你的 linq 查询中使用
Contains() -
.GetAll()是否返回IQuerable? -
@Magnus:是的,它返回 IQuerable...
-
@Rhumborl:我不明白 :(
标签: c# sql-server linq inner-join