C# Linq动态生成查询,无具体类型
实际上,我正在部署一个通用搜索控件,这是因为我有许多实体需要“searcherd” 我的建议:一个干涉案是可以接受的C# Linq动态生成查询,无具体类型,c#,linq,C#,Linq,实际上,我正在部署一个通用搜索控件,这是因为我有许多实体需要“searcherd” 我的建议:一个干涉案是可以接受的 public interface ISearchable { object SearchType { get; } string SearchField { get; set; } string SearchField2 { get; set; } string DisplayField { get; set; } decimal Sele
public interface ISearchable
{
object SearchType { get; }
string SearchField { get; set; }
string SearchField2 { get; set; }
string DisplayField { get; set; }
decimal SelectedKey { get; set; }
}
CLASE必须实现这样的接口:
public partial class PeopleInfoBasica : ISearchable
{
public string SearchField
{
get { return StrSearchKey; }
}
public string SearchField2
{
get { return StrSearchKeyPhoneDir; }
}
public string DisplayField
{
get { return StrNombreUsuario; }
}
public decimal SelectedKey
{
get { return NumIdContrato; }
}
public object SearchType
{
get { return new PeopleInfoBasica(); }
}
}
private Task PrimerFiltro(string primerfiltro)
{
MiContext db = Credentials.Db;
// Se aplica el primer filtro a la lista
var itemsQ = (from i in db.**Here I Need to Specify dynamically the type**
where i.SearchField.Contains(primerfiltro)
select i
).OrderBy(x => x.DisplayField);
filteredList = itemsQ.ToList();
ListaBase = filteredList;
}
现在,我的泛型对象必须处理过滤器,如下所示:
public partial class PeopleInfoBasica : ISearchable
{
public string SearchField
{
get { return StrSearchKey; }
}
public string SearchField2
{
get { return StrSearchKeyPhoneDir; }
}
public string DisplayField
{
get { return StrNombreUsuario; }
}
public decimal SelectedKey
{
get { return NumIdContrato; }
}
public object SearchType
{
get { return new PeopleInfoBasica(); }
}
}
private Task PrimerFiltro(string primerfiltro)
{
MiContext db = Credentials.Db;
// Se aplica el primer filtro a la lista
var itemsQ = (from i in db.**Here I Need to Specify dynamically the type**
where i.SearchField.Contains(primerfiltro)
select i
).OrderBy(x => x.DisplayField);
filteredList = itemsQ.ToList();
ListaBase = filteredList;
}
我的问题是:有没有一种方法可以动态地将类型指定给linq?
也许再来一杯
var itemsQ=(从数据库中的i开始。
这里我需要动态指定类型
其中i.SearchField.Contains(primerfiltro)
选择i
).OrderBy(x=>x.DisplayField)
使方法成为泛型,接受实现ISearchable
接口的类型参数T
,并添加可由方法使用的类型参数表达式
:
private Task PrimerFiltro(字符串PrimerFiltro,表达式filtereexpression),其中T:ISearchable
{
var db=Credentials.db;
var set=db.CreateObjectSet();
var filteredList=set.Where(filterExpression)
.OrderBy(x=>x.DisplayField)
.ToList();
ListaBase=filteredList;
}
请注意,我正在使用该方法动态获取与类型
T
对应的实体集。使您的方法成为泛型,接受实现ISearchable
接口的类型参数T
,并添加可由该方法使用的类型参数Expression
:
private Task PrimerFiltro(字符串PrimerFiltro,表达式filtereexpression),其中T:ISearchable
{
var db=Credentials.db;
var set=db.CreateObjectSet();
var filteredList=set.Where(filterExpression)
.OrderBy(x=>x.DisplayField)
.ToList();
ListaBase=filteredList;
}
请注意,我正在使用该方法动态获取与类型
T
对应的实体集。此解决方案使用SQL查询数据库。我冒昧地删除了界面,以缩短答案
首先,模型类:
[SearchField("StrSearchKey")]
public partial class PeopleInfoBasica
{
public string StrSearchKey { get; set; } //The property to search on. Created by EF or code-first
...
}
请注意其中包含搜索字段的新属性:
public class SearchFieldAttribute : Attribute
{
public SearchFieldAttribute(string searchField)
{
SearchField = searchField;
}
public string SearchField { get; private set; }
}
要获取searchField,请使用:
var attribute = type.GetCustomAttributes(typeof(SearchFieldAttribute), false).FirstOrDefault() as SearchFieldAttribute;
var searchField = attribute.SearchField;
请在使用前添加安全检查
结合以上内容,您现在应该能够使用以下工具进行查询:
_db.Set(yourType).SqlQuery(String.Format("SELECT * FROM dbo.{0} WHERE {1} LIKE '%{2}%'", tableName, searchField, primerfiltro))
可以从类名或EF中找到表名。取决于您是否使用CodeFirst、是否使用复数等
请注意,我第一次尝试了一种构建表达式树的解决方案,但它也存在无法使用of type()的问题
我仍然认为最好的解决方案是尝试将搜索的方法设置为泛型,或者简单地为每个类编写查询。它可能是更多的代码,但不太容易被破坏
上述代码易受SQL注入攻击,因此请小心。此解决方案使用SQL查询数据库。我冒昧地删除了界面,以缩短答案 首先,模型类:
[SearchField("StrSearchKey")]
public partial class PeopleInfoBasica
{
public string StrSearchKey { get; set; } //The property to search on. Created by EF or code-first
...
}
请注意其中包含搜索字段的新属性:
public class SearchFieldAttribute : Attribute
{
public SearchFieldAttribute(string searchField)
{
SearchField = searchField;
}
public string SearchField { get; private set; }
}
要获取searchField,请使用:
var attribute = type.GetCustomAttributes(typeof(SearchFieldAttribute), false).FirstOrDefault() as SearchFieldAttribute;
var searchField = attribute.SearchField;
请在使用前添加安全检查
结合以上内容,您现在应该能够使用以下工具进行查询:
_db.Set(yourType).SqlQuery(String.Format("SELECT * FROM dbo.{0} WHERE {1} LIKE '%{2}%'", tableName, searchField, primerfiltro))
可以从类名或EF中找到表名。取决于您是否使用CodeFirst、是否使用复数等
请注意,我第一次尝试了一种构建表达式树的解决方案,但它也存在无法使用of type()的问题
我仍然认为最好的解决方案是尝试将搜索的方法设置为泛型,或者简单地为每个类编写查询。它可能是更多的代码,但不太容易被破坏
上述代码易受SQL注入攻击,因此请小心。Tks寻求您的帮助。。但是如果我没有这个类型,我怎么做才能运行它呢。对该类型的唯一引用是对象。@JuanPabloGomez因为您的对象实现了一个公共接口,我相信它会更好地为您服务。谢谢您的帮助。。但是如果我没有这个类型,我怎么做才能运行它呢。对该类型的唯一引用是对象。@JuanPabloGomez因为您的对象实现了一个公共接口,我相信它会更好地为您服务。您好。谢谢你的帮助。必须使用哪个库才能访问此方法?实际上我使用的是EF 6.1,无法找到
Set
方法。我想要你的解决方案,但找不到实现它的方法。请你再详细解释一下好吗。嗯。我不太明白你为什么看不到。它从5.0开始就存在了:自从我从EF 5.0升级到6.1,它是额外的,我的项目引用了System.Data
,而不是System.Data.Entity
,我将搜索更多关于它的信息。同样,tks。您的凭证类型是什么。Db?(MiContext从何而来?)嗨。谢谢你的帮助。必须使用哪个库才能访问此方法?实际上我使用的是EF 6.1,无法找到Set
方法。我想要你的解决方案,但找不到实现它的方法。请你再详细解释一下好吗。嗯。我不太明白你为什么看不到。它从5.0开始就存在了:自从我从EF 5.0升级到6.1,它是额外的,我的项目引用了System.Data
,而不是System.Data.Entity
,我将搜索更多关于它的信息。同样,tks。您的凭证类型是什么。Db?(MiContext从何而来?)你能详细说明一下你想做什么吗?为什么你必须实现这个接口?你能详细说明一下你想做什么吗?为什么必须实现这个接口?