簡體   English   中英

相關實體的 EF 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.

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