C# Linq何处第2条条件订单?

C# Linq何处第2条条件订单?,c#,linq,C#,Linq,我尝试了这个linq代码来获取问题 return (from i in db.Question where i.Id == questionId || (i.RelatedId == questionId && i.IsAccept == isAccept) select i) .ToList(); 我有两个问题,但他们的顺序错了。我可以说Linq得到第一个where子句,然后是第二个条件吗 注意:首先获取i.Id==questionI

我尝试了这个linq代码来获取问题

return (from i in db.Question 
        where i.Id == questionId || (i.RelatedId == questionId && i.IsAccept == isAccept)
        select i)
    .ToList();
我有两个问题,但他们的顺序错了。我可以说Linq得到第一个where子句,然后是第二个条件吗

注意:首先获取
i.Id==questionId
然后获取第二个条件行


注2:Id和RelatedId是Guid。我尝试在没有order by和单查询的情况下执行此操作

您可以保留一个变量,该变量显示返回的行,并满足您的条件。然后在匿名类型中选择该行以及该变量(此处称为“order”)。最后,根据变量按结果排序并选择行

return (from i in db.Question
        where i.Id == questionId || (i.RelatedId == questionId && i.IsAccept == isAccept)
        let order = i.Id == questionId ? 1 : 0
        select new {i, order}).Orderby(a => a.order).Select(a => a.i)
    .ToList();

您可以保留一个变量,该变量显示返回的行,并满足您的条件。然后在匿名类型中选择该行以及该变量(此处称为“order”)。最后,根据变量按结果排序并选择行

return (from i in db.Question
        where i.Id == questionId || (i.RelatedId == questionId && i.IsAccept == isAccept)
        let order = i.Id == questionId ? 1 : 0
        select new {i, order}).Orderby(a => a.order).Select(a => a.i)
    .ToList();

对于数据库查询,您可以使用异步查询并在以后合并结果,这使得代码更易于理解,并且异步查询几乎同时执行

var byIdTask = 
    db.Question.Where(question => question.Id == questionId).ToListAsync();
var relatedTask = 
    db.Question.Where(question => question.RelatedId = questionId)
               .Where(question => question.IsAccept == isAccept)
               .ToListAsync();

await Task.WhenAll(new[] byIdTask, relatedTask);

var allQuestions = byIdTask.Result.Concat(relatedTask.Result).ToList();

对于数据库查询,您可以使用异步查询并在以后合并结果,这使得代码更易于理解,并且异步查询几乎同时执行

var byIdTask = 
    db.Question.Where(question => question.Id == questionId).ToListAsync();
var relatedTask = 
    db.Question.Where(question => question.RelatedId = questionId)
               .Where(question => question.IsAccept == isAccept)
               .ToListAsync();

await Task.WhenAll(new[] byIdTask, relatedTask);

var allQuestions = byIdTask.Result.Concat(relatedTask.Result).ToList();

我试过这个,然后找工作

List<Question> final = new List<Question>();
var result = (from i in db.Question where i.Id == questionId || (i.RelatedId == questionId && i.IsAccept == isAccept) select i).ToList();
final.Add(result.Where(a => a.Id == questionId).SingleOrDefault());
final.Add(result.Where(a => a.Id != questionId).SingleOrDefault());
List final=新列表();
var result=(从db.Question中的i开始,其中i.Id==questionId | |(i.RelatedId==questionId&&i.IsAccept==IsAccept)选择i)。ToList();
Add(result.Where(a=>a.Id==questionId).SingleOrDefault());
Add(result.Where(a=>a.Id!=questionId).SingleOrDefault());

我通过一个查询获取所有信息,并根据条件将它们添加到列表中

我尝试了这个方法,并且正在寻找工作

List<Question> final = new List<Question>();
var result = (from i in db.Question where i.Id == questionId || (i.RelatedId == questionId && i.IsAccept == isAccept) select i).ToList();
final.Add(result.Where(a => a.Id == questionId).SingleOrDefault());
final.Add(result.Where(a => a.Id != questionId).SingleOrDefault());
List final=新列表();
var result=(从db.Question中的i开始,其中i.Id==questionId | |(i.RelatedId==questionId&&i.IsAccept==IsAccept)选择i)。ToList();
Add(result.Where(a=>a.Id==questionId).SingleOrDefault());
Add(result.Where(a=>a.Id!=questionId).SingleOrDefault());

我通过单个查询获取所有结果,并将它们添加到带条件的列表中

,所以您想在不使用“排序依据”的情况下对结果进行排序?你看到这种逻辑的缺陷了吗?为什么是单一查询?您是否希望看到显著的性能提升?因为我不认为你会得到你想要的,用你目前想要的方法…所以你想在不使用order by的情况下对结果进行排序?你看到这种逻辑的缺陷了吗?为什么是单一查询?您是否希望看到显著的性能提升?因为我不认为你会得到你想要的,用你目前想要的方法…我认为当你有两个查询和两个ToListSync,你会发送两个查询到数据库,我认为这是昂贵的。我说的对吗?这两个查询将几乎同时执行,而无需等待对方完成。可以肯定的是,现代数据库将处理两个并行查询,而不会给您或用户带来显著的成本。两个查询将提供仅使用O(n)连接而不是排序项的可能性。我认为,当您有两个带有两个ToListSync的查询时,您会向数据库发送两个查询,而且我认为这很昂贵。我说的对吗?这两个查询将几乎同时执行,而无需等待对方完成。可以肯定的是,现代数据库将处理两个并行查询,而不会给您或用户带来显著的成本。两个查询将提供仅使用O(n)连接而不是排序项的可能性。