使用LINQ TO SQL是在2009年开始的,那个时候是给公司做一个自用的采购系统,初次接触这个东西,之前一直是做JAVA的,使用SSH框架,很多的时候查询语句都是拼接出来的SQL语句,而微软的LINQ TO SQL则不是这个样子的,所以那个时候在做SQL里的LINK的时候,一个字符串,我会先判断是不是为空为NULL然后在查询,导致了我的LINQ语句变成了这个样子:
1 var matches = from t in db.tPriceConfirmInfo
2 where
3 (ProjectNameText.Text != "" && ProjectNameText.Text != null ? t.tProjectInfo.ProjectName.Contains(ProjectNameText.Text) : true)
4 group t by new
5 {
6 t.PriceConfirmNo
7 }
8 into p
9 select new
10 {
11 ...
12 };
这让我当时觉得LINQ实在是BT到了一定程度了啊,怎么会有这么BT的判断方式啊!然后找啊找也没找到好的方式。
如今这个系统公司使用了两年多了,期间更改了很多东西,更改的时候自己对LINQ的认识也逐渐的多了起来,也学到了不少,发现其实很多时候还是自己的水平限制,对它的了解不够才写出这样的代码来。不过,这也是一个学习的过程。比如上面语句中的ProjectNameText.Text != "" && ProjectNameText.Text != null就可以更换为string.IsNullOrEmpty( ProjectNameText.Text)。
今天在看LINQ关于预编译查询的内容。
下面这段内容中包含了预编译,Lamabda表达式,匿名方法,我更倾向于Lamabda方式来写LINQ查询。
private static PMSDBDataContext PMS = new PMSDBDataContext();
private static Func<PMSDBDataContext, string, string, string, IEnumerable<PriceConfrimList>> _priceConfirmInfo;
public static IEnumerable<PriceConfrimList> PriceConfirmInfoCollection(string ProjectName, string RequestNo, string PriceConfirmNo, out int ItemCount)
{
if (_priceConfirmInfo == null)
{
_priceConfirmInfo = CompiledQuery.Compile<PMSDBDataContext, string, string, string, IEnumerable<PriceConfrimList>>
((db, PName, RNo, PNo) =>
db.tPriceConfirmInfo.Where(t => t.State == true).
Where(t => t.tProjectInfo.ProjectName.Contains(PName)).
Where(t => t.RequestNo.Contains(RNo)).
Where(t => t.PriceConfirmNo.Contains(PNo)).
Select(p => new PriceConfrimList
{
PriceConfirmNo = p.PriceConfirmNo,
Url = HttpUtility.UrlEncode(p.PriceConfirmNo),
ProjectName = p.tProjectInfo.ProjectName,
RequestNo = p.RequestNo,
FillDate = p.FillDate,
PLCheck = Options.GetState(p.PLCheckState)
}).Distinct()
);
}
IEnumerable<PriceConfrimList> Result = _priceConfirmInfo.Invoke(PMS, ProjectName, RequestNo, PriceConfirmNo);
ItemCount = Result.Count();
return Result;
}
就在这之后,上面这段内容查询出来的结果集不支持绑定分页,这个具体为什么我还没仔细去看,不过当我看以前的LINQ语句和上面的预编译语句的时候我发现一个问题,就是关于Contains方法的不同的地方,于是我尝试更换了以前的LINQ查询语句,变成这样:
var matches = from t in db.tPriceConfirmInfo
where
t.tProjectInfo.ProjectName.Contains(ProjectNameText.Text)
group t by new
{
t.PriceConfirmNo
}
into p
select new
{
...
};
一个学习的过程而已,高手无视就行了。
更多内容请访问我的博客:http://luacloud.com/2011/linq-to-sql-contains.html