我正在尝试使用一些测试数据来开发数据库.
我context.People.AddOrUpdate(p => p.Id, people));用得很成功了.
我有另一个我需要播种的表,其中我不知道主键.
例如,我想基于First和Last名称匹配AddOrUpdate.
我不确定如何正确编写表达式.
context.People.AddOrUpdate(p => p.FirstName && p.LastName, people);
Run Code Online (Sandbox Code Playgroud)
显然不正确,但我希望它能传达我正在寻找的解决方案.
根据我使用lambda而不是字符串属性名称问题选择模型属性的答案,想要向集合添加属性,如下所示:
var props = new ExportPropertyInfoCollection<JobCard>();
props.Include(model => model.BusinessInstallNumber).Title("Install No").Width(64).KeepZeroPadding(true);
props.Include(model => model.DeviceName).Title("Device").Width(70);
props.Include(model => model.DateRequested).Title("Request Date").Format("{0:dd/MM/yyyy}").Width(83);
Run Code Online (Sandbox Code Playgroud)
我在Include方法中编写了以下代码:
public class PropertyCollection<T>
{
public void Include(Expression<Func<T, object>> expression)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression != null)
{
var pes = new ExportPropertyInfoBuilder {Property = new ExportPropertyInfo {Property = memberExpression.Member as PropertyInfo}};
Properties.Add(pes.Property.Property.Name, pes.Property);
return pes;
}
Run Code Online (Sandbox Code Playgroud)
但是,在运行代码时,我发现一些lambda会按预期产生MemberExpression值,但是其他一些产生了UnaryExpression值.在使用lambdas添加所有属性之前,我必须将第一行代码更改为以下代码:
var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression; …Run Code Online (Sandbox Code Playgroud) MSDN文档说明:
Expression.Quote
方法创建一个UnaryExpression,表示具有Expression类型的常量值的表达式.
我已经能够通过使用Expression类手动构建它们来构建用于LINQ查询的谓词表达式,但从未遇到过对Expression.Quote的需求.
你何时以及为何使用这个?从我见过的LINQ表达式中看到它们,它们似乎只是在不添加任何值的情况下包装现有表达式.
Quote方法/节点类型的目的是什么?
我试图追加谓词和我的目标是创建相同的表达式:
Services.Where(s => s.Name == "Modules" && s.Namespace == "Namespace");
Run Code Online (Sandbox Code Playgroud)
我有以下代码:
Expression<Func<Service,string>> sel1 = s => s.Name;
Expression<Func<Service,string>> sel2 = s => s.Namespace;
var val1 = Expression.Constant("Modules");
var val2 = Expression.Constant("Namespace");
Expression e1 = Expression.Equal(sel1.Body, val1);
Expression e2 = Expression.Equal(sel2.Body, val2);
var andExp = Expression.AndAlso(e1, e2);
ParameterExpression argParam = Expression.Parameter(typeof(string), "s");
var lambda = Expression.Lambda<Func<string, bool>>(andExp, argParam);
Run Code Online (Sandbox Code Playgroud)
这将创建以下输出:
s => ((s.Name == "Modules") AndAlso (s.Namespace == "Namespace"))
Run Code Online (Sandbox Code Playgroud)
但是,这是错误的,因为Name和Namespace的参数不相同.如果我将其中一个表达式选择器更改为:
Expression<Func<Service,string>> sel2 = srv => srv.Namespace;
Run Code Online (Sandbox Code Playgroud)
输出将是:
s …Run Code Online (Sandbox Code Playgroud) 我正在寻找一些搜索例程使用LINQ,并希望有一些动态where子句.因此,例如,如果用户想要按城市搜索或按州搜索,我会有一个动态LINQ Where <>调用而不是创建两个强类型LINQ表达式,然后根据用户想要搜索的方式使用适当的LINQ表达式.
所以我想这样做:
String criteria="p.City='Pittsburgh'"; //or "p.State='PA'"
personData.Where(criteria)
Run Code Online (Sandbox Code Playgroud)
代替
personData.Where(p => p.City=="Pittsburgh");
要么
personData.Where(p => p.State=="PA");
我看到Scott Guthrie在Visual Studio 2008样本中谈论Dynamic LINQ 的博客文章.这似乎做我想要的,但我的问题是:
提前致谢!
我不明白这里发生了什么:
这两行都编译:
Func<object> func = () => new object();
Expression<Func<object>> expression = ()=>new object();
Run Code Online (Sandbox Code Playgroud)
但这不是:
expression = func;
Run Code Online (Sandbox Code Playgroud)
没有隐式运算符LambdaExpression或Expression<TDelegate>将委托转换为表达式,因此必须发生其他事情才能使赋值工作.它是什么?
我正在为nHibernate动态构建linq查询.
由于依赖关系,我想在以后转换/检索类型化的表达式,但到目前为止我还没有成功.
这不起作用(演员应该发生在其他地方):
var funcType = typeof (Func<,>).MakeGenericType(entityType, typeof (bool));
var typedExpression = (Func<T, bool>)Expression.Lambda(funcType, itemPredicate, parameter); //Fails
Run Code Online (Sandbox Code Playgroud)
这是有效的:
var typedExpression = Expression.Lambda<Func<T, bool>>(itemPredicate, parameter);
Run Code Online (Sandbox Code Playgroud)
是否有可能从LambdaExpression获取'封装'类型表达式?
我有一个产生各种一些代码Func<>使用委托System.Linq.Expressions和Expression.Lambda<Func<>>.Compile()等等,我想能够序列化生成的函数为供以后使用的组件.在过去,我已经使用System.Reflection.Emit做了一些事情,但是现在Linq表达式我宁愿不再去那条路了.
是否有一种机制可以将已编译的表达式或某种桥接从Expressions命名空间序列化到Emit命名空间?
编辑
上下文的一些背景:我正在研究一个查询引擎(主要是为了我自己的启发和享受).给定一个SQL语句,我想解析并将其转换为lambda函数,然后将其序列化为磁盘以供以后使用(并重复执行).
在伪代码我到这一点:
Func<IEnumerable<T>, IEnumerable<T1>> query = Query.Parse<T, T1>("Select field AS A, field1 AS B from T where T.field2 > 5");
Run Code Online (Sandbox Code Playgroud)
(其中字段,字段1和字段2是性能T型和甲和乙是属性类型T1.和我可以通过任何枚举<T>到query并取回和的枚举<T1>所述查询条件相匹配.
所以我想将序列化为query磁盘作为已经编译的程序集,所以在以后我可以加载它并评估不同的集合<T>而不解析和编译它.我正在想象一下:
AssemblyBuilder builder = new AssemblyBuilder(...);
ModuleBuilder module = builder.DefineDynamicModule(...);
TypeBuilder type = module.DefineType(...);
type.AddMethod(query); // <--- where this piece does not …Run Code Online (Sandbox Code Playgroud) 我正在创建一个Validator<T>班级.我正在尝试SelectMany为我的验证器实现Linq 扩展方法,以便能够使用Linq查询组合表达式,并在基础值发生更改时验证最终结果.
以下测试代码演示了我的意图.
var a = 2;
var b = 3;
var va = Validator.Create(() => a, n => n >= 0 && n < 5);
var vb = Validator.Create(() => b, n => n >= 0 && n < 5);
var vc = from ia in va
from ib in vb
select ia + ib;
Debug.Assert(vc.Value == a + b); //2 + 3
Debug.Assert(vc.Value == 5);
Debug.Assert(vc.IsValid == true);
a = 7;
Debug.Assert(vc.Value == a …Run Code Online (Sandbox Code Playgroud) 我在我的表中存储了一些过滤数据.让我更清楚一点:我想将一些where子句及其值存储在数据库中,并在我想从数据库中检索数据时使用它们.
例如,考虑一个people表(实体集)和另一个表中的一些过滤器:
"age" , "> 70"
"gender" , "= male"
Run Code Online (Sandbox Code Playgroud)
现在,当我从people表中检索数据时,我想让这些过滤器过滤我的数据.
我知道我可以生成一个SQL查询作为字符串并执行它,但在EF,LINQ中还有其他更好的方法吗?
linq-expressions ×10
c# ×7
linq ×7
.net ×3
lambda ×3
expression ×2
.net-4.0 ×1
casting ×1
dynamic-linq ×1
seed ×1
sql ×1
sql-server ×1