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)
};
數據在一次調用多次修改/添加時,數據雙份修改的錯誤原因:
Entity在SaveChanges()方法使用時,ObjectContext是在for(foreach)循環外面,導致每次的修改後的值,後面再次循環時又發生一次改變。 修改方式是將 ObjectContext放在for(foreach)循環裏面,Using ObjectContext對象,對象使用後,會自動斷開連接,消除之前循環的數據。
可空字段的賦值:
CardAmount= CardAmount ?? 0;
Linq中group 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中對於In與Like的用法:
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%")
Linq中SubString與Contains的區別:
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); //decimal轉string //直接轉換會消除小數位
First與Single的使用:
First,返回序列中的第一條記錄,如果沒有記錄,則引發異常
FirstOrDefault,返回序列中的第一條記錄,如果序列中不包含任何記錄,則返回默認值。
Single,返回序列中的唯一一條記錄,如果沒有或返回多條,則引發異常。
SingleOrDefault,返回序列中的唯一一條記錄,如果序列中不包含任何記錄,則返回默認值,如果返回多條,則引發異常。
ToList()的使用:
存在循環,ToList()在循環外使用;
不存在循環,當需要用時,再根據情況適用。
Select new:
Linq中,select查詢多個字段時,可以不用select new 實體類,可以直接select new 去查詢。
In與Order 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 後面跟對象的要求:對數據類型嚴格限制,避免出現數據溢出等錯誤。