gpt4 book ai didi

c# - Linq 在没有具体类型的情况下动态构建查询

转载 作者:太空宇宙 更新时间:2023-11-03 21:30:23 25 4
gpt4 key购买 nike

实际上我正在部署一个通用搜索控件,这是因为我有很多实体需要“searcherd”

我的方法:一个接口(interface) ISearshable

public interface ISearchable
{
object SearchType { get; }
string SearchField { get; set; }
string SearchField2 { get; set; }
string DisplayField { get; set; }
decimal SelectedKey { get; set; }
}

类必须像这样实现这个接口(interface):

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的Type?也许另一种方法?

var itemsQ = (from i in db.这里我需要动态指定类型 其中 i.SearchField.Contains(primerfiltro)
选择我
).OrderBy(x => x.DisplayField);

最佳答案

此解决方案使用 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,有复数等等。

请注意,我首先尝试了构建表达式树的解决方案,但它具有无法使用 OfType() 的相同问题。

我仍然认为最好的解决方案是尝试使您搜索的方法通用,或者简单地为每个类编写查询。它可能有更多的代码,但不太容易被破坏。

以上代码存在SQL注入(inject)漏洞,请注意。

关于c# - Linq 在没有具体类型的情况下动态构建查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24618652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com