Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq动态生成查询,无具体类型_C#_Linq - Fatal编程技术网

C# Linq动态生成查询,无具体类型

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

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

我的建议:一个干涉案是可以接受的

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从何而来?)你能详细说明一下你想做什么吗?为什么你必须实现这个接口?你能详细说明一下你想做什么吗?为什么必须实现这个接口?