标签: linq-expressions

如何使用EF 4.3中的复杂密钥使用AddOrUpdate对数据进行种子设定

我正在尝试使用一些测试数据来开发数据库.

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)

显然不正确,但我希望它能传达我正在寻找的解决方案.

c# seed linq-expressions ef-migrations entity-framework-4.3

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

为什么有些对象属性是UnaryExpression和其他的MemberExpression?

根据我使用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)

.net linq linq-expressions

70
推荐指数
1
解决办法
1万
查看次数

LINQ的Expression.Quote方法的目的是什么?

MSDN文档说明:

Expression.Quote

方法创建一个UnaryExpression,表示具有Expression类型的常量值的表达式.

我已经能够通过使用Expression类手动构建它们来构建用于LINQ查询的谓词表达式,但从未遇到过对Expression.Quote的需求.

你何时以及为何使用这个?从我见过的LINQ表达式中看到它们,它们似乎只是在不添加任何值的情况下包装现有表达式.

Quote方法/节点类型的目的是什么?

linq expression linq-expressions

42
推荐指数
1
解决办法
5420
查看次数

如何从Expression <Func <MyClass,string >>动态创建Expression <Func <MyClass,bool >>谓词?

我试图追加谓词和我的目标是创建相同的表达式:

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)

但是,这是错误的,因为NameNamespace的参数不相同.如果我将其中一个表达式选择器更改为:

Expression<Func<Service,string>> sel2 = srv => srv.Namespace;
Run Code Online (Sandbox Code Playgroud)

输出将是:

s …
Run Code Online (Sandbox Code Playgroud)

c# linq expression-trees linq-expressions

40
推荐指数
2
解决办法
5万
查看次数

动态LINQ - 是否有.NET 4版本?

我正在寻找一些搜索例程使用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 的博客文章.这似乎做我想要的,但我的问题是:

  1. 此示例库是否受Microsoft支持?
  2. Scott Guthrie的文章是关于VS2008(.NET 3.5)的..NET 4有更好的选择吗?也许用.NET 4发布的东西可以实现同样的东西(或者非常接近的东西)?

提前致谢!

c# linq dynamic-linq linq-expressions

31
推荐指数
3
解决办法
2万
查看次数

如何将Func <T>隐式转换为Expression <Func <T >>?

我不明白这里发生了什么:

这两行都编译:

 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)

没有隐式运算符LambdaExpressionExpression<TDelegate>将委托转换为表达式,因此必须发生其他事情才能使赋值工作.它是什么?

c# linq lambda expression linq-expressions

17
推荐指数
1
解决办法
1028
查看次数

如何将LambdaExpression转换为类型化表达式<Func <T,T >>

我正在为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获取'封装'类型表达式?

.net c# lambda casting linq-expressions

17
推荐指数
1
解决办法
1万
查看次数

我如何发出System.Linq.Expression?

我有一个产生各种一些代码Func<>使用委托System.Linq.ExpressionsExpression.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)

c# lambda reflection.emit .net-4.0 linq-expressions

16
推荐指数
1
解决办法
1904
查看次数

如何撰写Linq表达式?即Func <Exp <Func <X,Y >>,Exp <Func <Y,Z >>,Exp <Func <X,Z >>>

我正在创建一个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)

.net c# linq linq-expressions

14
推荐指数
2
解决办法
4216
查看次数

实体框架按字符串sql过滤数据

我在我的表中存储了一些过滤数据.让我更清楚一点:我想将一些where子句及其值存储在数据库中,并在我想从数据库中检索数据时使用它们.

例如,考虑一个people表(实体集)和另一个表中的一些过滤器:

"age" , "> 70"
"gender" , "= male"
Run Code Online (Sandbox Code Playgroud)

现在,当我从people表中检索数据时,我想让这些过滤器过滤我的数据.

我知道我可以生成一个SQL查询作为字符串并执行它,但在EF,LINQ中还有其他更好的方法吗?

sql linq sql-server entity-framework linq-expressions

14
推荐指数
1
解决办法
1780
查看次数