Linq筆記

Linq多個字段的 Left join查詢:

Var query=from p in AAA

          join q in BBB on new {aa=p.Aa,bb=p.Bb } equals new {q.aa,q,bb } into g  //字段名稱要一致,不要再用where條件

          from g1 in g.DefaultOrDefault()

                      select p;

 

Linq多個字段的 Inner join查詢:

Var query=from p in AAA

          join q in BBB on new  p.aa equals q.aa into g

          from g1 in g.DefaultOrDefault()

          where p.bb==g.bb

                      select p;

 

Var query=from p in AAA

          join q in BBB on new  p.aa equals q.aa where p.bb.Equals(q.bb)

                      select p;

 

Linq中子查詢帶條件示例:

var Bcompany = fromq in _unit.BCompanyRepository.GetAll() select q;

var Bcomsuming =from p in _unit.BConsumRepository.GetAll()

                    where new int[] { 0, 3, 8,9 }.Contains(p.TransactionType)

                    select p;

var query = from pin _unit.BCompanyRepository.GetAll()

            where p.CompanyType == 3 &&p.IsConsuming == false && p.ParentCompanyID != null

            select new

            {

                CompanyName = p.CompanyName,

                Amount = Bcomsuming.Where(c=> Bcompany

                       .Where(d => d.ParentCompanyID == p.CompanyID)    //從最外面一層來的條件

                        .Select(d =>d.CompanyID)

                        .Contains(c.CompanyID?? 0))

                        .Sum(c => c.Amount)

            };

 

 

 

數據在一次調用多次修改/添加時,數據雙份修改的錯誤原因:

EntitySaveChanges()方法使用時,ObjectContext是在for(foreach)循環外面,導致每次的修改後的值,後面再次循環時又發生一次改變。 修改方式是將 ObjectContext放在for(foreach)循環裏面,Using ObjectContext對象,對象使用後,會自動斷開連接,消除之前循環的數據。

 

 

可空字段的賦值:

CardAmount= CardAmount ?? 0;

 

Linqgroup by多個表的字段:

var query = (from p in context.siteInfo

                         from c in context.shopInfo

                         where c.siteID == p.siteID

                         group c by new { c.date, c.siteID, p.lon, p.lat } into g

                         select new site_shopInfo

                         {

                             siteID = (int)g.Key.siteID,

                             Longitude = (double)g.Key.lon,

                             Latitude = (double)g.Key.lat,

                             date = (DateTime)g.Key.date,

                             Totalearning = (int)g.Sum(t => t.earning)

                         }).ToList();

 

 

Linq中對於InLike的用法:

In:

where(new int?[] {1,2}).Contains(A.a)

where(from p in …...).Contains(A.a)

 

Not in:

where! (new int?[] {1,2}).Contains(A.a)

where(from p in …...).Contains(A.a)

 

Like '%aa%'

WhereA.a.Contains("aa")

where SqlMethods.Like(A.a, "%aa%")  //引用System.Data.Linq.SqlClient

 

Like '%aa'

.EndsWith("aa")

whereSqlMethods.Like(A.a, "%aa")

 

Like 'aa%'

.StartsWith("aa")

whereSqlMethods.Like(A.a, "aa%")

 

Like '%aa%aa%'

whereSqlMethods.Like(A.a, "%aa%aa%")

 


LinqSubStringContains的區別:

SubString(): 位置和字符都要匹配

Contains():  位置不用匹配,字符需要匹配

 

 

Linq比較日期部分大小:

WhereEntityFunctions.Diff(p.a???????)

 

 

 

 

Linq中的數據類型轉換方式:

int Num =StringUtils.GetDbInt(Name);       //object轉換成Int  //Hinlin調用

 

Name =SqlFunctions.StringConvert((decimal)p.Num).Trim();  //Int轉換成string  //Linq公共

 //消除存在空格的情況,(有時候數據是對的,但是就是不相等,就是多了空格。)

Amount =SqlFunctions.StringConvert((decimal)p.Num,18,2);  //decimalstring //直接轉換會消除小數位

 

 

 

FirstSingle的使用:

First,返回序列中的第一條記錄,如果沒有記錄,則引發異常

FirstOrDefault,返回序列中的第一條記錄,如果序列中不包含任何記錄,則返回默認值。

Single,返回序列中的唯一一條記錄,如果沒有或返回多條,則引發異常。

SingleOrDefault,返回序列中的唯一一條記錄,如果序列中不包含任何記錄,則返回默認值,如果返回多條,則引發異常。

 

ToList()的使用:

存在循環,ToList()在循環外使用;

不存在循環,當需要用時,再根據情況適用。

 

 

Select new

Linq中,select查詢多個字段時,可以不用select new 實體類,可以直接select new 去查詢。

 

 

InOrder by的使用:

Varquery= from A in db.A

                     where ( from B in db.Bselect B.a ).Contains(A.a)

                     orderby A.b ascending, A.c descending

         select A;

 

IsNull()方法的使用:

SQL: where IsNull(A.a, 0)!=0

Linq:  where (A.a == null ? 0 : A.a ) != 0

 

 

子查詢:

Var query=from A in db.A

          from B in db.B

          where A.a==B.a

          && A.c==(fromC in db.C where C.b==B.b select C.c).First()

          select new A;

 

 

into的作用:

可以使用 into上下文關鍵字創建一個臨時標識符,

以便將 group、join 或select 子句的結果存儲到新的標識符中。

此標識符本身可以是附加查詢命令的生成器。

在 group 或 select子句中使用新標識符的用法有時稱爲“延續”。

類似於:

Select C.a1 from (select A.aas a1,B.a as a2 from A join B on A.a=B.a) as C

中的 "C"

 

Case when的用法:

Varquery=from A in db.A

                  select new

                 {

                 bb=(A.b==null ? 0 : A.b),

                 cc=(A.c!=null ? A.c : 0 )

     };

 

 

Join的用法:

Var query=from A in db.A

          join Bin db.B on A.a equalsB.a

          where A.c==""

          select new

          { ……};

 

說明:select new 後面可以不跟對象,便於對查詢出的數據類型不做限制,

            即查詢的數據原來是什麼類型,就是什麼類型。

            select new 後面跟對象的要求:對數據類型嚴格限制,避免出現數據溢出等錯誤。

發佈了43 篇原創文章 · 獲贊 2 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章