我有一个表格“参考”和一个表格“文章”,其中一篇文章引用其他文章。
我确实有一些简单的参考资料,比如:A -> B
SQL:
select ab.*
from Article a
inner join Reference ab on ab.ArticleFromId = a.Id
inner join Article b on b.Id = ab.ArticleToId
where a.ArticleNo = "1234"C# LINQ:
_context.Reference
.Where(r => r.ArticleFromNavigation.ArticleNo.Equals("1234"));我也有引用链,比如:a -> B -> C(假设一条链中最多只有3篇文章)
SQL:
select ab.ArticleFromId, bc.ArticleToId
from Article a
inner join Reference ab on ab.ArticleFromId = a.Id
inner join Article b on b.Id = ab.ArticleToId
inner join Reference bc on bc.ArticleFromId = b.Id
inner join Article c on c.Id = bc.ArticleToId
where a.ArticleNo = "1234"这在SQL中很容易,因为结果只是与附加联接相乘,但我不知道如何用LINQ编写它。
我希望它是这样的(这是行不通的):
_context.Reference
.Where(r => r.ArticleFromNavigation.ArticleNo.Equals("1234"))
.Select(r => new Reference
{
ArticleFromNavigation = r.ArticleFromNavigation, //this is article "A"
ArticleToNavigation = r.ArticleToNavigation.ReferenceArticleToNavigations //this wont work as it's a iCollection
}).AsNoTrackable();在这里,我想要"A -> C“的”引用“类型的新结果。我想我必须包括/select/join/select/select多(?)收集之前的“新参考”-section,但我毫无头绪。
有什么办法可以把它存档吗?
发布于 2019-04-01 11:01:38
好吧,您可以完全像在SQL中那样做,但是使用导航属性而不是联接。
我将使用LINQ查询语法,因为它更好地显示了相似性,而且对于这种类型的查询,方法语法非常复杂,很难阅读:
from a in _context.Article
from ab in a.ReferenceArticleFromNavigations
let b = ab.ArticleToNavigation
from bc in b.ReferenceArticleFromNavigations
let c = bc.ArticleToNavigation
where a.ArticleNo = "1234"
select new Reference
{
ArticleFromNavigation = a,
ArticleToNavigation = c,
}let语句并不是非常需要的(您可以直接使用引用导航属性),我将它们包括进来只是为了使LINQ查询更接近于SQL查询。
实际上,在这种情况下,方法等效并不是那么糟糕--使用嵌套的SelectMany来平平几个级别,并使用SelectMany重载来投影(顶部、底部)对,允许这样做:
_context.Article
.Where(a => a.ArticleNo = "1234")
.SelectMany(a => a.ReferenceArticleFromNavigations
.SelectMany(ab => ab.ArticleToNavigation.ReferenceArticleFromNavigations)
// include as many `SelectMany` like the above as you wish until you hit the desired level of nesting
.Select(bc => bc.ArticleToNavigation),
(a, c) => new Reference
{
ArticleFromNavigation = a,
ArticleToNavigation = c,
});发布于 2019-04-01 11:21:02
为了使语法正确,我将数据库建模为类。见下面的代码:
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication107
{
class Program
{
static void Main(string[] args)
{
Context _context = new Context();
string ArticleNo = "1234";
var results = (from a in _context.article.Where(x => x.Id == ArticleNo)
join ab in _context.reference
.Where(x => (x.ArticleFromId == x.ArticleToId))
on a.Id equals ab.ArticleFromId
select new { a = a, ab = ab }
).Select(r => new Reference()
{
ArticleFromNavigation = r.a,
ArticleToNavigation = r.a.ReferenceArticleToNavigations.ToList()
}).ToList();
}
}
public class Context
{
public List<Reference> reference { get; set; }
public List<Article> article { get; set; }
}
public class Reference
{
public string ArticleFromId { get; set; }
public string ArticleToId { get; set; }
public Article ArticleFromNavigation { get; set; }
public List<string> ArticleToNavigation { get; set; }
}
public class Article
{
public string Id { get; set; }
public List<string> ReferenceArticleToNavigations { get; set; }
}
}https://stackoverflow.com/questions/55452973
复制相似问题