[英]LinQ Query from different tables
這樣的事情可能嗎?
var query = _context.Group
.Where(g => g.StartDate > DateTime.Now)
.Select(g => new GroupDTO {
Name = g.GroupName,
StartDate = g.StartDate,
AvailableTeachers = _context.Teacher.Where(t => t.Available)
});
問題是,availableTeachers 在數據庫中沒有以任何方式鏈接到該組——我仍然會將它們存儲到我的 DTO 中以供以后使用——這可能嗎? 我不斷收到錯誤消息:
Unable to cast object of type 'Microsoft.EntityFrameworkCore.Query.SqlExpressions.SqlFunctionExpression' to type 'System.Linq.Expressions.ConstantExpression'.
更新
這個雖然有效,但比我嘗試的要好得多:
var teachers = _context.Teacher.Where(t => t.Available).ToList();
var query = _context.Group
.Where(g => g.StartDate > DateTime.Now)
.Select(g => new GroupDTO {
Name = g.GroupName,
StartDate = g.StartDate,
AvailableTeachers = teachers
});
由於教師沒有以任何方式連接到組,您可以通過在組請求中不包括對教師的請求來優化這一點。 由於您的語句現在已構建,您嘗試再次獲取每個組的可用教師。 如果您有 n 組,這意味着您將有 n 次請求具有相同結果的教師(如果教師的可用性沒有改變)。
您可以通過拆分請求來優化這一點,例如:
// Get the available teachers first (ToArray runs the query)
var teachers = _context.Teacher.Where(t => t.Available).ToArray();
// Get the groups
var query = _context.Group
.Where(g => g.StartDate > DateTime.Now)
.Select(g => new GroupDTO {
Name = g.GroupName,
StartDate = g.StartDate,
})
.ToArray() // This runs the query against the db
.Select(g => {
AvailableTeachers = teachers;
return g;
}) // This adds the teachers information after the db query
.ToArray();
上面的語句首先從數據庫中讀取教師並將它們存儲在一個變量中。 之后,從數據庫中讀取組。 在ToArray
之后,信息在內存中並設置了可用教師列表。
// fetch all the list of teachers who are available stored in memory.
var teachers = _context.Teacher.Where(t => t.Available).ToList();
// to get the group record
var query = _context.Group
.Where(g => g.StartDate > DateTime.Now)
.Select(g => new GroupDTO {
Name = g.GroupName,
StartDate = g.StartDate,
AvailableTeachers = teachers
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.