标签: linq-expressions

WhereNot linq表达式

我正在尝试创建一个扩展名"WhereNot"

所以我可以用:

Dim x = "Hello world "
Dim y = x.Split.WhereNot(AddressOf String.IsNullOrEmpty)
Run Code Online (Sandbox Code Playgroud)

请注意,我的目标是学习linq表达式; 没解决我的问题.

我创造了这个功能:

 <Extension()> _
 Public Function WhereNot(Of TElement)(ByVal source As IQueryable(Of TElement), ByVal selector As Expression(Of Func(Of TElement, Boolean))) As IQueryable(Of TElement)
  Return source.Where(GetWhereNotExpression(selector))
 End Function
Run Code Online (Sandbox Code Playgroud)

我不知道如何切换布尔标志,函数Negate会这样做吗?

vb.net和C#的答案都很受欢迎

.net linq expression expression-trees linq-expressions

3
推荐指数
1
解决办法
1348
查看次数

如何创建Expression&lt;Func&lt;T, TRelated&gt;&gt;的集合?

我有一个具有以下方法的存储库:

IEnumerable<T> FindAll<TRelated>(Specification<T> specification,
                                 Expression<Func<T, TRelated>> fetchExpression);
Run Code Online (Sandbox Code Playgroud)

我需要传递多个表达式。我正在考虑将签名更改为:

IEnumerable<T> FindAll<TRelated>(Specification<T> specification, 
                                 IEnumerable<Expression<Func<T, TRelated>>> fetchExpression);
Run Code Online (Sandbox Code Playgroud)
  1. 这可能吗?
  2. 例如,如何创建一个表达式数组以传递到此方法中?

目前我正在从服务层调用该方法,如下所示:

var products = productRepository.FindAll(specification,p => p.Variants);
Run Code Online (Sandbox Code Playgroud)

但我想通过p => p.Variantsp => p.Reviews例如。然后在存储库中,我想迭代表达式并将它们添加到查询中。

有关我为什么这样做的一些背景信息,请参阅 Ben Foster 的有关使用 NHibernate 进行预加载的博客文章。

linq specification-pattern linq-to-nhibernate linq-expressions

3
推荐指数
1
解决办法
2294
查看次数

不支持接口的映射,但Linq-Sql对象已经实现了属性

因此,我在 VS 中从现有数据库创建了一个 DataContext (Linq-Sql)。它有一个名为 Users 的表,因此我有一个User对象。我特别想关注UserIDUsername属性。

现在,我有一个界面:

interface IUser
{
     int Id { get; }
     string Username { get; }
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个部分User类并实现IUser. 这样做的原因是,我可以在许多地方将任何 User 视为 IUser,而不必关心确切的 User 类:

public partial class User : IUser
{
    public int Id
    {
         get { return UserID; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有实现Usernameget 属性,因为我知道实体对象已经实现了它。

当我有一个查询时,dc.Users.SingleOrDefault(p => p.Id == 5);我知道这是一个错误,因为它会将该调用转换为 SQL 语句,并且它会尝试查找Id不存在的列 - UserID 存在。所以我理解这个映射问题。

当我查询时dc.Users.SingleOrDefault(p => p.Username == …

sql linq interface linq-to-sql linq-expressions

3
推荐指数
1
解决办法
697
查看次数

使用LINQkit在LINQ to Entities Select中调用Expression

这就是我想要做的事情:

class MyDbContext : DbContext 
{
    private static Expression<Func<MyClass, int>> myExpression1 = x => /* something complicated ... */;
    private static Expression<Func<Item, int>> myExpression2 = x => /* something else complicated ... */;

    public object GetAllData()
    {
        return (
            from o in MyClassDbSet.AsExpandable() 
            select new 
            {
                data1 = myExpression1.Invoke(o),                      // problem 1
                data2 = o.Items.Select(myExpression2.Compile())       // problem 2
            }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

myExpression 必须与我的查询保持分离,因为我想在多个LINQ查询中重用它.

更新2:

分离myExpressionmyExpression1myExpression2明确指出,我想单独重用他们的事实.

更新3:

添加了LINQkit示例.

问题1抛出:无法将"System.Linq.Expressions.FieldExpression"类型的对象强制转换为"System.Linq.Expressions.LambdaExpression".

问题2抛出:内部.NET Framework数据提供程序错误1025.

c# linq-to-entities linq-expressions linqkit

3
推荐指数
1
解决办法
2244
查看次数

Linq表达式索引器属性

var param = Expression.Parameter(typeof(Employee), "t");    
MemberExpression member = Expression.Property(param, "EmployeeName");
var value = Convert.ChangeType(filterProperty.Value, member.Type);
ConstantExpression constant = Expression.Constant(value);
var body = Expression.Or(leftExpr, Expression.Equal(member, constant));
Run Code Online (Sandbox Code Playgroud)

我可以轻松获取正常属性的表达式,但是如何获取索引器属性的表达式?

Employee课堂上我有两个索引器.

    class Employee
    {
       public string EmployeeName {get;set;}

       public string this[EmployeeTypes empType]
       {
          get
           {
             return GetEmployee(empType);
           }
       }

       public string this[int empNum]
       {
          get
           {
             return GetEmployee(empNum);
           }
        }
    }
Run Code Online (Sandbox Code Playgroud)

c# linq asp.net entity-framework linq-expressions

3
推荐指数
1
解决办法
1431
查看次数

将单位-&gt;单位转换为动作

要将Hangfire与F#结合使用,我需要一点帮助:

Hangfire的BackgroundJob.Enqueue参数为System.Linq.Expressions.Expression泛型类型Action<'T>

因此完整: Expression<Action<'T>>

在我这边,我有一种方法可供使用:

let doSomething () = () 因此其签名为unit -> unit

Action(doSomething)如果被叫方使用Action,我怎么能完美传递,但没有。

那么,如何将我转换unit -> unitExpression<Action<'T>>

linq f# linq-expressions hangfire

3
推荐指数
1
解决办法
135
查看次数

具有嵌套属性的动态linq表达式树

我有一个列表,我必须过滤子属性.过滤器运算符是动态的,我正在使用谓词构建器来组合多个过滤器/ lambdas.

为简单起见,我们假设我有两个这样的类:

public class FirstClass
{
    public int Id { get; set; }
    public ICollection<SecondClass> MyList { get; set; }
}

public class SecondClass
{
    public int ReferenceId { get; set; }
    public int Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的过滤器使用引用id,运算符类型和值,这样伪代码就像这样:

"list of FirstClass".Where(param1 => 
    param1.MyList.Single(param2 => 
        param2.ReferenceId == "reference id").Value "operatorType" "value")
Run Code Online (Sandbox Code Playgroud)

实际的过滤器类似于123 eq 456,其中引用标识为123,operatorType为"eq",值为456.

如果运算符只是相等,那么以下工作就可以了:

Expression<Func<FirstClass, bool>> lambda = 
    param1 => param1.MyList.Single(param2 => param2.ReferenceId == id).Value == value;
Run Code Online (Sandbox Code Playgroud)

此外,仅FirstClass使用动态表达式进行过滤,就像魅力一样,例如过滤Id(我的ExpressionTypeDictionary是用于ExpressionType根据提供的选择的字典operatorType): …

c# linq entity-framework linq-expressions expressionbuilder

3
推荐指数
1
解决办法
886
查看次数

预编译的 lambda 表达式用于创建具有带参数的构造函数的类

我目前正在Activator.CreateInstance创建一个类的实例,其类型作为通用参数传入。问题是,这太慢了。我在某处读到,我可以使用预编译的 lambda 表达式执行相同的操作,但是,在我的情况下,由于需要将参数传递给正在创建的类的实例,因此我在实现此操作时遇到了麻烦。

目前我正在做以下事情

public class Class1
{
    private int TestVariable;

    public Class1(int testVariable)
    {
        TestVariable = testVariable;
    }

    public void TestMethod()
    {
        Console.WriteLine($"Test Variable was {TestVariable}");
    }
}

public object Test<T>(params object[] parameters)
{
    var instance = (T) Activator.CreateInstance(typeof(T), BindingFlags.Instance, null, new object[] {9999}, null);

    var testMethod = typeof(T).GetMethod("TestMethod", BindingFlags.Instance);

    return testMethod.Invoke(instance, parameters)
}
Run Code Online (Sandbox Code Playgroud)

我如何使用预编译的 lambda 表达式完成类似的事情?

c# lambda linq-expressions

3
推荐指数
1
解决办法
2975
查看次数

.NET MVC强类型助手 - 从属性中获取价值?

我正在创建一个强类型帮助器(参考:SO问题).如下面的代码中的'评论',是否有可能以某种方式从表达的属性中获取值,从而绕过可选selectedValue参数?

    <Extension()> _
    Public Function DatePickerFor(Of TModel As Class, TProperty)(ByVal htmlHelper As HtmlHelper(Of TModel), ByVal expression As Expression(Of Func(Of TModel, TProperty)), Optional ByVal selectedValue As Nullable(Of Date) = Nothing) As MvcHtmlString
        Dim inputName = ExpressionHelper.GetExpressionText(expression)
        Dim inputValue = selectedValue 
        //Something like this possible? 
        //inputValue = ExpressionHelper.GetExpressionValue(expression)
        Return DatePicker(htmlHelper, inputName, inputValue)
    End Function
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc linq-expressions strongly-typed-helper

2
推荐指数
1
解决办法
1835
查看次数

评估LambdaExpression?

我正在制作一个LINQ lambda表达式:

 Expression<Func<double, double, double>> add = (x, y) => x + y;
Run Code Online (Sandbox Code Playgroud)

但现在我如何评估它,比如找2 + 3?

c# linq linq-expressions

2
推荐指数
1
解决办法
119
查看次数