2011-12-15 79 views
1

我在MySQL實體中有一個本機連接子查詢問題。 SQL代碼是;Linq子查詢(在SELECT中選擇)

DB結構是;

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ı. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: 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ı. 

感謝您的幫助。

回答

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 - 

謝謝。

+0

'Result5();' 'Result6();' 'Result7();' 正在工作。 –

1

您是否嘗試過:這裏

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 
       }); 

更新就是我可以從你的意見理解:

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 
    } 
+0

它非常可愛的解決方案。但它只解決這個空和非空字段。但是它又有了什麼記錄。我必須總是添加一些值SQL語句。例如; 'k.id == p.kod_id || p.kod_id == null || p.kod_id == bla bla || p.kod_id == null bla bla' –

+0

@AhmetYETİK:我不明白你的問題。如果你想返回所有的p.Kod_id,那麼就不需要設置where子句。根據你的評論,你應該刪除'where k.id == p.kod_id || p.kod_id == null'。否則,p.kod_id等於k.id或null。 – Kamyar

+0

對不起,我的語言。我想嘗試以另一種方式解釋它;這句話 'where(k.id == p.kod_id)' - returns 3 'where where(k.id == null)' - returns 0 'where where(k.id!= null)' - returns 27 '哪裏(k.id == p.kod_id && p.kod_id == null)' - 返回0 它有一些問題。因爲它加入了tbl_urunler和tbl_urunler_kod ...但是它會在tbl_urunler返回一行時看tbl_urunler_kod並返回kod。 謝謝。 –

1

這是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}) 
+1

謝謝你的回答@esi。我會在晚上試試。 我喜歡拉姆達語句。它更容易理解。 :) –

+0

你好艾哈邁德lambda expperssion是非常非常好的linq,所以請嘗試學習它。 – Esi

+1

親愛的@esi; 但它只解決這個null和not null字段。但是它又有了什麼記錄。我必須總是添加一些值SQL語句。例如; 'k.id == p.kod_id || p.kod_id == null || p.kod_id == bla bla' 是否有任何其他通過Lambda的全局解析。再次感謝。 –