动态linq表达式
本文关键字:表达式 linq 动态 | 更新日期: 2023-09-27 18:18:27
我有一个Linq应用程序,我需要得到一个动态的where表达式。我使用class:
public class EntityColumnsField
{
public String ColumnName { get; set; }
public Type ColumnType { get; set; }
public bool IsPK { get; set; }
public String TableName { get; set; }
public Type TableType { get; set; }
}
我得到列表的列实体的方法:
public static IEnumerable<EntityColumnsField> GetAllColumnsFromEntity(params EntityObject[] entities)
{
if (entities == null || entities.Count() == 0)
throw new ArgumentNullException("entity");
List<EntityColumnsField> ColumnList = new List<EntityColumnsField>();
foreach (var entity in entities)
{
ColumnList.AddRange(from p in entity.GetType().GetProperties()
where p.GetCustomAttributes(typeof(EdmScalarPropertyAttribute), false).Any()
select new EntityColumnsField()
{
TableName = entity.GetType().Name,
ColumnName = p.Name,
ColumnType = p.PropertyType,
IsPK = p.GetCustomAttributes(false).Where(a => a is EdmScalarPropertyAttribute && ((EdmScalarPropertyAttribute)a).EntityKeyProperty).Count() > 0
});
}
return ColumnList.OrderBy(a => a.TableName);
}
我有3个表(用户,UserPartner和UserFriends),我需要生成所有字符串字段的条件。我试着这样做:
using (var db = new DB())
{
var ll = from x in db.Users
join y in db.UserPartners on x.ID equals y.ID
join z in db.UserFriends on x.ID equals z.ID
select new { Users = x, UserPartners = y, UserFriends = z };
}
if (!String.IsNullOrEmpty(fulltext))
{
var AllSearchField = Utils.GetAllColumnsFromEntity(new User(), new UserPartner(), new UserFriends());
//TODO:
//Here i need a code, which generate predicate for all text fields in tables
//the result would be like :
//ll.Where(a => a.Users.Address.Contains(fulltext) || a.Users.Email.Contains(fulltext) || a.UserPartners.Email.Contains(m.FullText))
}
有谁知道怎么做吗?由于
你可以试试Dynamic Linq
NuGet:https://www.nuget.org/packages/System.Linq.Dynamic
ScottGu示例:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
试试这种方法:
System.Linq.Dynamic 1.0.0
这是.Net 4.0 Dynamic language
功能的Microsoft程序集。
安装System.Linq.Dynamic
,在Package Manager Console
PM> Install-Package System.Linq.Dynamic
你可能需要这样的东西,
var ll;
using (var db = new DB())
{
ll = from x in db.Users
join y in db.UserPartners on x.ID equals y.ID
join z in db.UserFriends on x.ID equals z.ID
select new { Users = x, UserPartners = y, UserFriends = z };
}
if (!String.IsNullOrEmpty(fulltext))
{
var AllSearchField = Utils.GetAllColumnsFromEntity(new User(), new UserPartner(), new UserFriends());
//TODO:
//Here i need a code, which generate predicate for all text fields in tables
//the result would be like :
foreach (var source in ll.Where(a => a.Users.Address.Contains(fulltext) || a.Users.Email.Contains(fulltext) || a.UserPartners.Email.Contains(m.FullText)))
{
// do something with source
}
}
你也可以使用FindAll函数
foreach (var source in ll.FindAll(a => a.Users.Address.Contains(fulltext) || a.Users.Email.Contains(fulltext) || a.UserPartners.Email.Contains(m.FullText)))
{
// do something with source
}