Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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# 使用LINQtoSQL(EF6)动态组合select_C#_Linq - Fatal编程技术网

C# 使用LINQtoSQL(EF6)动态组合select

C# 使用LINQtoSQL(EF6)动态组合select,c#,linq,C#,Linq,是否可以基于表达式构建部分查询 public List<SelectListItem> GetSelectedListFromEntity<T>(Expression<Func<T, object>> property) where T : BaseEntity<int> { var result = _repository.Query<T>().Select(p => new Sel

是否可以基于表达式构建部分查询

    public List<SelectListItem> GetSelectedListFromEntity<T>(Expression<Func<T, object>> property) where T : BaseEntity<int>
    {
         var result = _repository.Query<T>().Select(p => new SelectListItem()
         {
           Text = property, //? (in simple case it looks like:  p.Name + p.Category)
           Value = p.Id.ToString(),
         ).ToList();

         return result;
    }
公共列表GetSelectedListFromEntity(表达式属性),其中T:BaseEntity { var result=\u repository.Query().Select(p=>newselectListItem() { Text=property,/?(在简单情况下,它看起来像:p.Name+p.Category) Value=p.Id.ToString(), ).ToList(); 返回结果; } 用于:

var result=GetSelectedListFromEntity(p=>p.Name+p.Category);

如果您想让它与db提供程序一起工作,您可以使用下面的表达式树来实现IQueryable

鉴于这些类别:

public class BaseEntity
{
    public int Id { get; set;}
}

public class Product : BaseEntity
{
    public string Name { get; set; }
    public string Category { get; set; }
}
现在需要一个函数来生成表达式:

public Expression<Func<T, SelectListItem>> CreateExpression<T>(Expression<Func<T, string>> textExp) where T : BaseEntity
{
    var arg = textExp.Parameters.First();       
    var param = new ParameterExpression[] { arg };
    var body = Expression.MemberInit(
        Expression.New(typeof(SelectListItem)), 
        Expression.Bind(typeof(SelectListItem).GetMember("Text").First(), textExp.Body),
        Expression.Bind(typeof(SelectListItem).GetMember("Value").First(), 
            Expression.Call(
                Expression.PropertyOrField(arg, "Id"),
                "ToString",
                new Type[0]
                )));
    var exp = Expression.Lambda(body, param);
    return (Expression<Func<T, SelectListItem>>)exp;
}
public Expression CreateExpression(Expression textextexp)其中T:BaseEntity
{
var arg=textexexp.Parameters.First();
var param=新参数表达式[]{arg};
var body=Expression.MemberInit(
Expression.New(typeof(SelectListItem)),
Expression.Bind(typeof(SelectListItem).GetMember(“Text”).First(),textextExp.Body),
Expression.Bind(typeof(SelectListItem).GetMember(“Value”).First(),
表情,打电话(
Expression.PropertyOrField(arg,“Id”),
“ToString”,
新类型[0]
)));
var exp=表达式Lambda(body,param);
返回(表达式)exp;
}
在C#6中,最好用nameof()替换那些神奇的字符串。 最后你可以这样称呼它:

var items = new List<Product> { new Product { Id = 0, Name = "Test", Category = "Cat" } };

var result = items.AsQueryable().Select(CreateExpression<Product>(p => p.Name + p.Category)).ToList();  
var items=newlist{newproduct{Id=0,Name=“Test”,Category=“Cat”};
var result=items.AsQueryable().Select(CreateExpression(p=>p.Name+p.Category)).ToList();

现在,只要您的linq提供程序能够处理SelectListItems,您就应该可以了。

如果您想让它与db提供程序一起工作,那么您可以使用这样的表达式树来实现IQueryable

鉴于这些类别:

public class BaseEntity
{
    public int Id { get; set;}
}

public class Product : BaseEntity
{
    public string Name { get; set; }
    public string Category { get; set; }
}
现在需要一个函数来生成表达式:

public Expression<Func<T, SelectListItem>> CreateExpression<T>(Expression<Func<T, string>> textExp) where T : BaseEntity
{
    var arg = textExp.Parameters.First();       
    var param = new ParameterExpression[] { arg };
    var body = Expression.MemberInit(
        Expression.New(typeof(SelectListItem)), 
        Expression.Bind(typeof(SelectListItem).GetMember("Text").First(), textExp.Body),
        Expression.Bind(typeof(SelectListItem).GetMember("Value").First(), 
            Expression.Call(
                Expression.PropertyOrField(arg, "Id"),
                "ToString",
                new Type[0]
                )));
    var exp = Expression.Lambda(body, param);
    return (Expression<Func<T, SelectListItem>>)exp;
}
public Expression CreateExpression(Expression textextexp)其中T:BaseEntity
{
var arg=textexexp.Parameters.First();
var param=新参数表达式[]{arg};
var body=Expression.MemberInit(
Expression.New(typeof(SelectListItem)),
Expression.Bind(typeof(SelectListItem).GetMember(“Text”).First(),textextExp.Body),
Expression.Bind(typeof(SelectListItem).GetMember(“Value”).First(),
表情,打电话(
Expression.PropertyOrField(arg,“Id”),
“ToString”,
新类型[0]
)));
var exp=表达式Lambda(body,param);
返回(表达式)exp;
}
在C#6中,最好用nameof()替换那些神奇的字符串。 最后你可以这样称呼它:

var items = new List<Product> { new Product { Id = 0, Name = "Test", Category = "Cat" } };

var result = items.AsQueryable().Select(CreateExpression<Product>(p => p.Name + p.Category)).ToList();  
var items=newlist{newproduct{Id=0,Name=“Test”,Category=“Cat”};
var result=items.AsQueryable().Select(CreateExpression(p=>p.Name+p.Category)).ToList();

现在,只要您的linq提供商能够处理SelectListItems,您就应该可以了。

不清楚您在问什么,请澄清您的具体问题或添加其他详细信息,以突出显示您所需的内容。正如目前所写的,很难准确说出您在问什么。正如您所写的。它看起来是表达式属性ha返回一个对象..是吗?@Awesome,调用item
Text=property(p).ToString()上的函数
。您基本上是在询问如何为select构建显示文本?select采用一个表达式,因此您可以动态构建一个表示所需表达式的表达式树,并将其传入。不清楚您所问的问题,请澄清您的具体问题或添加其他详细信息,以突出显示您所需的内容。因为它是当前的从字面上讲,很难准确地说出你在问什么。当你写的时候。它看起来表达式属性必须返回一个对象。是吗?@Awesome,调用item
Text=property(p)上的函数。ToString()
。您基本上是在询问如何构造select?select的显示文本,它接受一个表达式,因此您可以动态构建一个表达式树,表示所需的表达式,并将其传入。这正是我想要的!谢谢。这正是我想要的!谢谢。