【发布时间】:2018-07-06 18:11:36
【问题描述】:
我发现join 运算符does not allow the use of Contains 和only performs equijoins。但是,我需要执行“not equijoin”。
我特别需要使用以下设置编写查询。给定两种类型的对象Class 和Student
public class Class
{
public string Name { get; set; } = "";
public List<Guid> Students { get; set; } = new List<Guid>();
}
public class Student
{
public Guid StudentId { get; set; } = Guid.NewGuid();
public int Grade { get; set; } = 0;
}
Class 通过StudentId 引用其Student。我想写一个子句来查找所有Class,其中所有Student 的平均成绩高于某个值。
class Program
{
static void Main(string[] args)
{
// Create all of the students
var class1Students = new List<Student>()
{
new Student() {Grade = 70 },
new Student() {Grade = 70 }
};
var class2Students = new List<Student>()
{
new Student() {Grade = 80 },
new Student() {Grade = 80 }
};
var class3Students = new List<Student>()
{
new Student() {Grade = 90 },
new Student() {Grade = 90 }
};
var allStudents = new List<Student>();
allStudents.AddRange(class1Students);
allStudents.AddRange(class2Students);
allStudents.AddRange(class3Students);
// Create all of the classes
var class1 = new Class()
{
Name = "Class1",
Students = class1Students.Select(s => s.StudentId).ToList()
};
var class2 = new Class()
{
Name = "Class2",
Students = class2Students.Select(s => s.StudentId).ToList()
};
var class3 = new Class()
{
Name = "Class3",
Students = class3Students.Select(s => s.StudentId).ToList()
};
var allClasses = new List<Class>() { class1, class2, class3 };
// Get all classes where the average grade is above 70
var query = from cls in allClasses
join std in allStudents on
}
}
我想这样写查询
var query = from cls in allClasses
join std in allStudents on cls.Students.Contains(std.StudentId) into clsStds
where clsStds.Select(aStd => aStd.Grade).Average() > 70
select cls;
虽然这显然是无效的语法。 page linked above 提供了一个非等值连接的示例,尽管我尝试在此处应用它并且似乎无法正确重现它(和/或我自己严重混淆了)。
如何模拟我上面描述的join 的类型?
【问题讨论】:
-
所以你只想要所有班级成绩都在 70 分以上的学生?
-
我想要反过来,我想要所有学生平均成绩在 70 以上的班级。
-
您标记了问题
IQueryable,但您似乎正在使用LINQ to Objects;你能解释为什么标签?我通过查找提供的解决方案假定 LINQ to Objects。 -
IQueryable来自于 MongoDB 中LinqExtension的使用。这个问题代表了与我希望构建到我拥有的 MongoDB 的查询的更简单和类似的情况(因此您在回答中提到了奇怪的数据模型)。 -
对不起,
IMongoQueryable,我这里才意识到这个Mongo的具体用法。
标签: c# linq iqueryable