2017-06-29 28 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 –