簡體   English   中英

來自不同表的 LinQ 查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM