[英]Why EF Core automatically load related entities when property referring to the entity is accessed in Select method of Linq?
[英]EF LINQ method for related entities
我正在嘗試使用擴展方法和 EF 代碼編寫一個 LINQ 查詢,首先遍歷 3 個相關實體。 CpeDefinition & PaperMachine 實體與 Tag 實體具有多對多關系。
我有 2 個用於此查詢的靜態輸入,1 個用於 Cpe Id,另一個用於標記名稱。
我想在用戶選擇的 id 上獲取 CpeDefinition 記錄,然后對於該 Cpe 記錄,我想獲取映射到該 Cpe 的所有匹配標簽,然后我想通過用戶輸入的標簽名稱和冒號過濾這些結果標簽。 最后,從這些結果標簽中,我想將 PaperMachine 記錄映射到這些標簽。
public class Tag {
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<CpeDefinition> CpeDefinitions { get; set; }
public virtual ICollection<PaperMachine> PaperMachines { get; set; }
}
public class CpeDefinition
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
public class PaperMachine
{
public int Id { get; set; }
public string Type { get; set; }
public string Plant { get; set; }
public string Line { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
modelBuilder.Entity<PaperMachine>()
.HasMany<Tag>(p => p.Tags)
.WithMany(t => t.PaperMachines)
.Map(pt => {
pt.MapLeftKey("PaperMachineId");
pt.MapRightKey("TagId");
pt.ToTable("PaperMachinesTags");
});
modelBuilder.Entity<CpeDefinition>()
.HasMany<Tag>(d => d.Tags)
.WithMany(t => t.CpeDefinitions)
.Map(dt => {
dt.MapLeftKey("CpeDefinitionId");
dt.MapRightKey("TagId");
dt.ToTable("CpeDefinitionsTags");
最初我有這個查詢,它幾乎讓我到達那里,但它沒有通過匹配的 CpeDefinition 過濾標簽(它返回與用戶輸入的標簽匹配的所有造紙機,但不是用戶選擇的 Cpe:
string tag = "SiteA";
var taggedPaperMachines = db.Tags
.Where(t => t.Name.Contains(String.Concat(tag, ":")))
.Select(p => new
{
p.PaperMachines.FirstOrDefault().Id,
p.PaperMachines.FirstOrDefault().Line,
p.PaperMachines.FirstOrDefault().Plant,
p.PaperMachines.FirstOrDefault().Type
}).ToList()
.Select(pm => new PaperMachine
{
Id = pm.Id,
Line = pm.Line,
Plant = pm.Plant,
Type = pm.Type
});
我嘗試將 Cpe 和標簽放在一起,但我收到了一個空錯誤,我不明白為什么,因為我知道數據庫表中有一個 Id = 1 的 Cpe:
轉換為值類型 'System.Int32' 失敗,因為具體化值為 null。 結果類型的泛型參數或查詢必須使用可空類型
int CpeId = 1;
string TagName = "SiteA";
var temp1 = db.CpeDefinitions
.Where(cd => cd.Id == CpeId)
.Select(cd => new
{
cd.Tags.FirstOrDefault().Id,
cd.Tags.FirstOrDefault().Name
})
.ToList()
.Select(t => new Tag
{
Id = t.Id,
Name = t.Name
});
在一個完美的世界中,我希望將所有這些邏輯都包含在一個查詢中,但此時不介意將第二個查詢的結果推送到第一個查詢中。
好簡單 :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataBase db = new DataBase();
string tag = "SiteA";
var query = (from t in db.Tags
join c in db.CpeDefinitions on t.Id equals c.Id
select new { tag = t, definition = c }
).ToList();
List<PaperMachine> paperMachines = query.Where(x => x.tag.Name == (tag + ":"))
.SelectMany(x => x.tag.PaperMachines).ToList();
}
}
public class DataBase
{
public List<Tag> Tags { get; set; }
public List<CpeDefinition> CpeDefinitions { get; set; }
public List<PaperMachine> PaperMachines { get; set; }
}
public class Tag
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<CpeDefinition> CpeDefinitions { get; set; }
public virtual ICollection<PaperMachine> PaperMachines { get; set; }
}
public class CpeDefinition
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
public class PaperMachine
{
public int Id { get; set; }
public string Type { get; set; }
public string Plant { get; set; }
public string Line { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.