我正在尝试创建一个扩展名"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#的答案都很受欢迎
我有一个具有以下方法的存储库:
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)
目前我正在从服务层调用该方法,如下所示:
var products = productRepository.FindAll(specification,p => p.Variants);
Run Code Online (Sandbox Code Playgroud)
但我想通过p => p.Variants,p => p.Reviews例如。然后在存储库中,我想迭代表达式并将它们添加到查询中。
有关我为什么这样做的一些背景信息,请参阅 Ben Foster 的有关使用 NHibernate 进行预加载的博客文章。
linq specification-pattern linq-to-nhibernate linq-expressions
因此,我在 VS 中从现有数据库创建了一个 DataContext (Linq-Sql)。它有一个名为 Users 的表,因此我有一个User对象。我特别想关注UserID和Username属性。
现在,我有一个界面:
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 == …
这就是我想要做的事情:
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:
分离myExpression成myExpression1和myExpression2明确指出,我想单独重用他们的事实.
更新3:
添加了LINQkit示例.
问题1抛出:无法将"System.Linq.Expressions.FieldExpression"类型的对象强制转换为"System.Linq.Expressions.LambdaExpression".
问题2抛出:内部.NET Framework数据提供程序错误1025.
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) 要将Hangfire与F#结合使用,我需要一点帮助:
Hangfire的BackgroundJob.Enqueue参数为System.Linq.Expressions.Expression泛型类型Action<'T>。
因此完整: Expression<Action<'T>>
在我这边,我有一种方法可供使用:
let doSomething () = ()
因此其签名为unit -> unit。
Action(doSomething)如果被叫方使用Action,我怎么能完美传递,但没有。
那么,如何将我转换unit -> unit为Expression<Action<'T>>?
我有一个列表,我必须过滤子属性.过滤器运算符是动态的,我正在使用谓词构建器来组合多个过滤器/ 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): …
我目前正在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 表达式完成类似的事情?
我正在创建一个强类型帮助器(参考: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) 我正在制作一个LINQ lambda表达式:
Expression<Func<double, double, double>> add = (x, y) => x + y;
Run Code Online (Sandbox Code Playgroud)
但现在我如何评估它,比如找2 + 3?
linq-expressions ×10
linq ×7
c# ×5
.net ×1
asp.net ×1
asp.net-mvc ×1
expression ×1
f# ×1
hangfire ×1
interface ×1
lambda ×1
linq-to-sql ×1
linqkit ×1
sql ×1