2017-06-29 55 views
-1

我正在使用net 4.5,C#和实体框架。我希望能够在运行时为linq查询调用一个字段。实体框架 - 使用Linq调用字段名称

using var(context = new SomeDataEntities()) 
{ 
    var abc = from b in context.someTable 
       where b.SomeField == 1 
       select b.AnotherField; 
} 

但是我想调用基于输入字符串参数的b.SomeField。 我当前的代码是

using var(context = new SomeDataEntities()) 
{ 
    var abc = from b in context.someTable 
       where b.GetType().GetProperty("SomeField").GetValue(b, null).ToString() == "test" 
       select b.AnotherField; 
} 
+0

注 - 这只是一个基本的例子,我将执行一个更复杂的查询。 – dfresh22

+1

你不能,那不能被翻译成Transact sql查询。你唯一的选择是将整个内容检索到内存中,然后用反射执行where子句。您还可以使用支持使用字符串进行属性的动态sql生成的库。请参阅[动态LINQ](https://www.nuget.org/packages/System.Linq.Dynamic/) – Igor

+0

好的调用,我将探索使用表达式 – dfresh22

回答

4

如果要动态地创建一个where子句,要做到这一点,最好的办法是链接,而不是LINQ格式的方法。例如:

using (var context = new SomeDataEntities()) 
{ 
    var query = context.Set<SomeTable>(); 
    if (field1.HasValue) 
    { 
      query = query.Where(e => e.Field1 == field1.Value); 
    } 

    if (field2.HasValue) 
    { 
      query = query.Where(e => e.Field2 == field2.Value); 
    }  

    var abc = query.Select(b => b.AnotherField); 
} 

如果你有很多领域还是一个未知数数量,SQL生成可能是最好的策略,可与DbContext.Database.SqlQuery()方法进行访问。

+0

用你的例子,我将如何调用该字段?或按名称打电话?因为这里看起来需要定义。 (field1或field2)。 – dfresh22

+0

你有几个领域?通过链接方法,您必须为每个值构建它。如果你需要它是动态的,你可以建立到Where()子句的入口。 –

+0

Where子句的类型是Expression >。您可以从Expression.Equal(,)开始构建它:https://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.equal(v=vs.110).aspx –