【问题标题】:Linq Sub Query (SELECT in SELECT)Linq 子查询(SELECT 中的 SELECT)
【发布时间】:2011-12-15 01:19:07
【问题描述】:

我在 MySQL Entity 中遇到了本机连接子查询问题。 SQL 代码是;

数据库结构是;

tbl_urunler_kod
idkod
- 1、pkod1
- 2、pkod2
- 3、pkod3

tbl_urunler
idkod_id
- 1, 1
- 2, 2
- 3、3
- 4、空
- 5、空
- 6、空
- 7、空
- 8,空
- 9,空

SELECT (SELECT k.kod FROM tbl_urunler_kod k WHERE k.id=t.kod_id) AS kod FROM tbl_urunler t

它给出了 9 条记录。

我试试这个,

 var SQL = (from p in SME.tbl_urunler
                   from k in SME.tbl_urunler_kod
                              where k.id == p.kod_id
                   select new
                   {
                       kod = k.kod
                   });

它只返回 3 条记录。因为 tbl_urunler_kod 只有不为空的 3 条记录。其他 6 条记录为空。我想看所有的记录。我该怎么做。

我试试这个;

var SQL2 = (from p in SME.tbl_urunler
                       select new
                       {
                           kod = (from k in SME.tbl_urunler_kod where k.id == p.kod_id select new { k.kod })
                       });

它给出了这个错误;

'System.Data.Common.Internal.Materialization.CompensatingCollection`1[f__AnonymousType0`1[System.String]]' türündeki nesne 'System.String' türüne atılamadı。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息:System.InvalidCastException: 'System.Data.Common.Internal.Materialization.CompensatingCollection`1[f__AnonymousType0`1[System.String]]' türündeki nesne 'System.String' türüne atılamadı。

感谢您的帮助。

【问题讨论】:

    标签: linq entity-framework entity subquery


    【解决方案1】:

    为此,我创建了一个小模拟器。 请看结果;

    public class tbl_urunler_kod
    {
        public int ID { get; set; }
        public string Kod { get; set; }
        public tbl_urunler_kod() { }
        public tbl_urunler_kod(int _ID, string _Kod)
        {
            _ID = ID;
            _Kod = Kod;
        }
    }
    
    public class tbl_urunler
    {
        public int ID { get; set; }
        public string Adi { get; set; }
        public int KodID { get; set; }
        public tbl_urunler() { }
        public tbl_urunler(int _ID, string _Adi, int _KodID)
        {
            _ID = ID;
            _Adi = Adi;
            _KodID = KodID;
        }
    }
    
    public List<tbl_urunler_kod> L_tbl_urunler_kod = new List<tbl_urunler_kod>();
    public List<tbl_urunler> L_tbl_urunler = new List<tbl_urunler>();
    
    protected void Page_Load(object sender, EventArgs e)
    {
        Fill();
        Result1();
        Result2();
        Result3();
        Result4();
        Result5(); //Its working
        Result6(); //Its working
        Result7(); //Its working
    }
    
    public void Fill()
    {
        #region tbl_urunler_kod filling
        L_tbl_urunler_kod.Add(new tbl_urunler_kod { ID = 1, Kod = "Kod_1" });
        L_tbl_urunler_kod.Add(new tbl_urunler_kod() { ID = 2, Kod = "Kod_2" });
        L_tbl_urunler_kod.Add(new tbl_urunler_kod() { ID = 3, Kod = "Kod_3" });
        #endregion
    
        #region tbl_urunler filling
        L_tbl_urunler.Add(new tbl_urunler() { Adi = "Urun_1", ID = 1, KodID = 1 });
        L_tbl_urunler.Add(new tbl_urunler() { Adi = "Urun_2", ID = 2, KodID = 2 });
        L_tbl_urunler.Add(new tbl_urunler() { Adi = "Urun_3", ID = 3, KodID = 3 });
        L_tbl_urunler.Add(new tbl_urunler() { Adi = "Urun_4", ID = 4 });
        L_tbl_urunler.Add(new tbl_urunler() { Adi = "Urun_5", ID = 5 });
        L_tbl_urunler.Add(new tbl_urunler() { Adi = "Urun_6", ID = 6 });
        L_tbl_urunler.Add(new tbl_urunler() { Adi = "Urun_7", ID = 7 });
        L_tbl_urunler.Add(new tbl_urunler() { Adi = "Urun_8", ID = 8 });
        L_tbl_urunler.Add(new tbl_urunler() { Adi = "Urun_9", ID = 9 });
        #endregion
    }
    
    public void Result1()
    {
        Response.Write("<h1>Result 1</h1>");
    
        var SQL = (from p in L_tbl_urunler
                   from k in L_tbl_urunler_kod
                   where k.ID == p.KodID
                   select new
                   {
                       p.Adi,
                       kod = k.Kod
                   }); //result count = 3 record;
    
        foreach (var i in SQL)
        {
            Response.Write(i.Adi + " - " + i.kod + "<br/>");
        }
    
        Response.Write("<br/><hr/>");
    }
    
    public void Result2()
    {
        Response.Write("<h1>Result 2</h1>");
    
        var SQL = (from p in L_tbl_urunler
                   from k in L_tbl_urunler_kod
                   where k.ID == p.KodID || p.KodID == 0
                   select new
                   {
                       p.Adi,
                       kod = k.Kod
                   }); //result count = 21 record;
    
        foreach (var i in SQL)
        {
            Response.Write(i.Adi + " - " + i.kod + "<br/>");
        }
    
        Response.Write("<br/><hr/>");
    }
    
    public void Result3()
    {
        Response.Write("<h1>Result 3</h1>");
    
        var SQL = (from p in L_tbl_urunler
                   let LKod = L_tbl_urunler_kod.Where(k => k.ID == p.KodID).Select(x => x.Kod)
                   select new
                   {
                       p.Adi,
                       kod = LKod
                   }); //result count = 9 record;
    
        foreach (var i in SQL)
        {
            Response.Write(i.Adi + " - " + i.kod + "<br/>");
            //System.Linq.Enumerable+WhereSelectListIterator`2[test+tbl_urunler_kod,System.String]
        }
    
        Response.Write("<br/><hr/>");
    }
    
    public void Result4()
    {
        Response.Write("<h1>Result 4</h1>");
    
        var SQL = (from p in L_tbl_urunler
                   select new
                   {
                       p.Adi,
                       kod = (from k in L_tbl_urunler_kod where k.ID == p.KodID select new { k.Kod })
                   }); //result count = 9 record;
    
        foreach (var i in SQL)
        {
            Response.Write(i.Adi + " - " + i.kod + "<br/>");
            //System.Linq.Enumerable+WhereSelectListIterator`2[test+tbl_urunler_kod,<>f__AnonymousType3`1[System.String]]
        }
    
        Response.Write("<br/><hr/>");
    }
    
    public void Result5()
    {
        Response.Write("<h1>Result 5</h1>");
    
        var SQL = (from p in L_tbl_urunler
                   select new
                   {
                       p.Adi,
                       kod = L_tbl_urunler_kod.Where(k => k.ID == p.KodID).Select(x => x.Kod).FirstOrDefault()
                   }); //result count = 9 record;
    
        foreach (var i in SQL)
        {
            Response.Write(i.Adi + " - " + i.kod + "<br/>");
        }
    
        Response.Write("<br/><hr/>");
    }
    
    public void Result6()
    {
        Response.Write("<h1>Result 6</h1>");
    
        var SQL = (from p in L_tbl_urunler
                   select new
                   {
                       p.Adi,
                       kod = (from k in L_tbl_urunler_kod where k.ID == p.KodID select new { k.Kod }).FirstOrDefault()
                   }); //result count = 9 record;
    
        foreach (var i in SQL)
        {
            Response.Write(i.Adi + " - " + i.kod + "<br/>");
        }
    
        Response.Write("<br/><hr/>");
    }
    
    public void Result7()
    {
        Response.Write("<h1>Result 7</h1>");
    
        var SQL = (from p in L_tbl_urunler
                   let LKod = L_tbl_urunler_kod.Where(k => k.ID == p.KodID).Select(x => x.Kod).FirstOrDefault()
                   select new
                   {
                       p.Adi,
                       kod = LKod
                   }); //result count = 9 record;
    
        foreach (var i in SQL)
        {
            Response.Write(i.Adi + " - " + i.kod + "<br/>");
        }
    
        Response.Write("<br/><hr/>");
    }
    

    结果 1

    Urun_1 - Kod_1
    Urun_2 - Kod_2
    Urun_3 - Kod_3
    

    结果 2

    Urun_1 - Kod_1
    Urun_2 - Kod_2
    Urun_3 - Kod_3
    Urun_4 - Kod_1
    Urun_4 - Kod_2
    Urun_4 - Kod_3
    Urun_5 - Kod_1
    Urun_5 - Kod_2
    Urun_5 - Kod_3
    Urun_6 - Kod_1
    Urun_6 - Kod_2
    Urun_6 - Kod_3
    Urun_7 - Kod_1
    Urun_7 - Kod_2
    Urun_7 - Kod_3
    Urun_8 - Kod_1
    Urun_8 - Kod_2
    Urun_8 - Kod_3
    Urun_9 - Kod_1
    Urun_9 - Kod_2
    Urun_9 - Kod_3
    

    结果 3

    Urun_1 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,System.String]
    Urun_2 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,System.String]
    Urun_3 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,System.String]
    Urun_4 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,System.String]
    Urun_5 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,System.String]
    Urun_6 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,System.String]
    Urun_7 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,System.String]
    Urun_8 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,System.String]
    Urun_9 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,System.String]
    

    结果 4

    Urun_1 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,<>f__AnonymousType31[System.String]]
    Urun_2 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,<>f__AnonymousType31[System.String]]
    Urun_3 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,<>f__AnonymousType31[System.String]]
    Urun_4 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,<>f__AnonymousType31[System.String]]
    Urun_5 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,<>f__AnonymousType31[System.String]]
    Urun_6 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,<>f__AnonymousType31[System.String]]
    Urun_7 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,<>f__AnonymousType31[System.String]]
    Urun_8 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,<>f__AnonymousType31[System.String]]
    Urun_9 - System.Linq.Enumerable+WhereSelectListIterator2[test+tbl_urunler_kod,<>f__AnonymousType31[System.String]]
    

    结果 5

    Urun_1 - Kod_1  
    Urun_2 - Kod_2  
    Urun_3 - Kod_3  
    Urun_4 -  
    Urun_5 -  
    Urun_6 -  
    Urun_7 -  
    Urun_8 -  
    Urun_9 -
    

    结果 6

    Urun_1 - { Kod = Kod_1 }  
    Urun_2 - { Kod = Kod_2 }  
    Urun_3 - { Kod = Kod_3 }  
    Urun_4 -  
    Urun_5 -  
    Urun_6 -  
    Urun_7 -  
    Urun_8 -  
    Urun_9 -
    

    结果 7

    Urun_1 - Kod_1  
    Urun_2 - Kod_2  
    Urun_3 - Kod_3  
    Urun_4 -  
    Urun_5 -  
    Urun_6 -  
    Urun_7 -  
    Urun_8 -  
    Urun_9 -
    

    谢谢。

    【讨论】:

      【解决方案2】:

      你试过了吗:

      var SQL = (from p in SME.tbl_urunler
                     from k in SME.tbl_urunler_kod
                                where k.id == p.kod_id || p.kod_id == null
                     select new
                     {
                         kod = k.kod
                     });
      

      更新以下是我从您的 cmets 中可以理解的内容:

      var q = from u in SME.tbl_urunler
          join k in SME.tbl_urunler_kod on u.kod_id equals k.id into JoinedUK
          from k in joinedUK.DefaultIfEmpty()
          select new
          {
              id = u.id,  
              kod = k != null ? k.kod : null
          }
      

      【讨论】:

      • 它非常可爱的解决方案。但它只解决这个空字段而不是空字段。但它已经得到了另一个记录。我必须总是添加一些值 SQL 语句。例如; k.id == p.kod_id || p.kod_id == null || p.kod_id == bla bla || p.kod_id == null bla bla
      • @AhmetYETİK:我不明白你的问题。如果要返回所有 p.Kod_id,则无需设置 where 子句。根据您的评论,您应该删除where k.id == p.kod_id || p.kod_id == null。否则,p.kod_id 要么等于 k.id 要么为 null。
      • 对不起我的语言。我想尝试用另一种方式来解释它;这句 where (k.id == p.kod_id) - 返回 3 where (k.id == null) - 返回 0 where (k.id != null) - 返回 27 where (k.id == p.kod_id &amp;&amp; p.kod_id ==null) - 返回 0 它有一些问题。因为它加入了 tbl_urunler 和 tbl_urunler_kod ...但是它会在 tbl_urunler 返回一行时查看 tbl_urunler_kod 并返回 kod。谢谢。
      • @AhmetYETİK:更新了我的答案
      • @AhmetYETİK:对不起,我忘了使用equals。请再次运行我更新的查询。
      【解决方案3】:

      这是 LingtoSql lambda 表达式

          var query = SME.tbl_urunler.Where
                      (x=>x.tbl_urunler_kod.id == x.kod_id  || 
                      x.kod_id == null).Select(x=>new {x.id})
      

      【讨论】:

      • 感谢您的回答@esi。我会在晚上尝试。我喜欢 lambda 语句。它更容易理解。 :)
      • Hello Ahmet lambda experssion 在 linq 上非常好,所以尝试学习它。
      • 亲爱的@esi;但它只解决这个空字段而不是空字段。但它已经得到了另一个记录。我必须总是添加一些值 SQL 语句。例如; k.id == p.kod_id || p.kod_id == null || p.kod_id == bla bla 是否有任何其他通过 Lambda 的全局解决方案。再次感谢。
      • Ahmet 我无法清楚地理解您的评论。但是如果我没有弄错这很简单,您可以在 lambda experssion 中的 where 语句上使用任何变量,例如( int count= 100; dataContext.TableName.Where(x=>x.id == count); )
      • 我现在正在查看您的代码。它的加入很好。但它会在 tbl_urunler 返回一行时查看 tbl_urunler_kod 并返回 tbl_urunler 列并给出“kod”。它应该是这样的; (from p in SME.tbl_urunler select new { kod = (from k in SME.tbl_urunler_kod where k.id == p.kod_id select new { k.kod }) }); 谢谢。
      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 2014-02-23
      • 2020-12-27
      • 1970-01-01
      • 2016-01-22
      • 2014-10-13
      • 2020-02-10
      • 2012-08-16
      相关资源
      最近更新 更多