public class Address
{
public int Id { get; set; }
public string Street { get; set; }
public string Door { get; set; }
}
public class Member
{
public int Id { get; set; }
public string Name { get; set; }
public string Level { get; set; }
public Address MyAddress { get; set; }
}
public class DynamicLinqQueryTest
{
public List<Member> _list = new List<Member>();
public void Initilize()
{
for (int i = 0; i < 20; i++ )
{
Member member = new Member();
member.Id = i + 1;
member.Name = "Member" + (i + 1);
member.MyAddress = new Address()
{
Id = i + 1,
Street = "Street" + (i + 1),
Door = "Door" + (i + 1)
};
member.Level = "Level" + (i + 1);
}
}
public void Test()
{
Initilize();
var members = (from m in _list select m).AsQueryable<Member>().Take<Member>(5).Where("d=@0 and Level=@1", 2, "Level2").
Where("Name.Contains(@0)", "6").OrderBy("MyAddress.Street, Level desc").Select("new(Id as MyId, Level)");
foreach (dynamic member in members)
{
int Id = member.Id;
string name = member.Name;
Console.WriteLine(name + Id);
}
}
}
方法分析:
OrderBy(string parm) 这个方法是用来排序的,其参数为Member的某一个字段,或者多个字段,并且可以传入排序方式
OrderBy("Level")
OrderBy("Level desc, Name")
OrderBy("MyAddress.Street, Level desc")
Where(string parm, parmas[] values) 方法是用来根据指定条件进行筛选的,包括SQL中的like语句,这里用Contain关键字
where("Id=@0 and Level=@1", 2, "Level2")
Where("Name.Contains(@0)", "6")
Select("")方法是用来指定要返回的字段,并且可以为字段指定别名。如果在整个Linq语句中不使用此方法,则默认返回所有字段
Select("new(Id as MyId, Level)")
当需要分页的时候,我没有找到相应的扩展方法,但是我发现,可以使用IQueryable自带的方法Take(int count)
另外要注意的是,返回的集合中的单个元素都是动态类型,需要使用dynamic关键字来进行遍历,不能使用var关键字。这涉及到关于编译期间是否进行类型检查的问题。
PS: Dynamic Linq Query的使用方法跟一般扩展方法一样,在项目中建一个static的类,然后把源代码拷贝进去就行使用了。源代码可以在Scott的博客中去下载Sample Project