在编程过程中,我们经常用到多条件的查询,而且是多表.如果简单的用拼写,感觉有点麻烦.又不能像SQL语句那样传条件语句.这时我们就要运用到了LINQ中的LMAD表达式.
如有两表,学生表:Student ,成绩表Scores
public class Stuent
{
/// <summary>
/// 姓名
/// </summary>
public string Name
{
set;
get;
}
/// <summary>
/// 生日
/// </summary>
public DateTime Birthday
{ set; get; }
/// <summary>
/// 地址
/// </summary>
public string Address
{
set;
get;
}
/// <summary>
/// 身份证
/// </summary>
public string CodeID
{
set;
get;
}
}
public class Scroes
{
/// <summary>
/// 语文
/// </summary>
public decimal YuWen
{
set;
get;
}
/// <summary>
/// 数学
/// </summary>
public decimal ShuXue
{
set;
get;
}
/// <summary>
/// 英语
/// </summary>
public decimal YinYu
{
set;
get;
}
/// <summary>
/// 身份证号关联使用
/// </summary>
public string CodeID
{
set;get;
}
}
private Expression<Func<T, bool>> GetContation<T>() where T :Stuent //这里的Student是指传递的类型为Student,比方多个地方继承了Student,这样就起到约束作用.
{
//初始定义返回条件,默认条件为真
Expression<Func<T,bool>> expresstion =t =>true;
//需要拼凑的条件
Expression<Func<T, bool>> e = null;
//这里就是加上各种条件判定了,假如界面上有一个文本框(txtName)
if (!string.IsNullOrEmpty(txtName.Text))
{
e = p => p.Name.Equals(txtName.Text); //这里是把条件放到表达式为e的变量中
//这里就是创建一个表达式了,并用用Parameters这样的传值方式,创建到expresstion变量中
var invokedExr = Expression.Invoke(e, expresstion.Parameters.Cast<Expression>());
//关联表达式,并运用条件传递
expresstion = Expression.Lambda<Func<T,bool>>(Expression.And(expresstion.Body, invokedExr),expresstion.Parameters);
}
//身份证号不为空
if (!string.IsNullOrEmpty(txtCodeID.Text))
{
e = p => p.CodeID.Equals(txtCodeID.Text);
var invokedExp = Expression.Invoke(e, expresstion.Parameters.Cast<Expression>()); //这里的 expresstion.Parameters.Cast<Expression>() 起到转换为标准的表达式形式
expresstion = Expression.Lambda<Func<T, bool>>(Expression.Add(expresstion.Body, invokedExp), expresstion.Parameters);
}
return expresstion;
}
private Expression<Func<T, bool>> GetContainterByScore<T>() where T : Scroes
{
Expression<Func<T, bool>> expression = t => true;
Expression<Func<T, bool>> e = null;
//这里比方说数学分数
if (!string.IsNullOrEmpty(txtShuXue.Text))
{
e = p => p.ShuXue == decimal.Parse(txtShuXue.Text); //这里的方法不一定是等于
var invokedExp = Expression.Invoke(e, expression.Parameters.Cast<Expression>());
expression = Expression.Lambda<Func<T, bool>>(Expression.And(expression.Body, invokedExp), expression.Parameters);
}
//这里还可以加更多
return expression;
}
//调用方法
//运用了两个表cdx.Tbl_Students cdx.Tbl_Scroes 这是运用DataContext可以产生的返回Table类型
var result = cdx.Tbl_Students.Where(GetContation<Stuent>()).Join(cdx.Tbl_Scores.Where(GetContainterByScore<Scroes>()), st => st.CodeID, sc => sc.CodeID, (x, y) => x);
//这是两表的内关联.也就是用Inner Join 来关联的,其中st是指Student表中何字段与Scores表中的何字段进行关联
//sc 也就是关联字段,
//(x,y)=>x 这是指两表关联,输出哪个表的内容,x代表第一个,y代表第二个,如果是两表都想输出,则是
//(x,y)=>new {X=x,Y=y} 这样就是输出两表内容了
至于一个表,就把从Join那儿删除就可以了.
这是自己运用的一些看法,如有不当,请指正.