【问题标题】:Dynamic Linq Conditional Select动态 Linq 条件选择
【发布时间】:2012-11-03 23:47:41
【问题描述】:
var Data = from z in initialData
           select new
           {
              z.ID,
              z.Value = (z.Col1 != null)? z.Col1 : z.Col2
           };

如何将此查询转换为动态 linq 表达式?这甚至可能吗?

【问题讨论】:

  • 我认为不可能,因为编译器为这个查询创建了一个匿名类。
  • 代码可以改进为z.Value = z.Col1 ?? z.Col2
  • 你所拥有的甚至是不可能的,你会得到:'无效的匿名类型成员声明器。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。'
  • 我很困惑,你需要哪个部分是动态的?
  • @Juvil 我在复杂的环境中需要这种行为。

标签: c# linq dynamic dynamic-linq


【解决方案1】:

试试这个 http://msdn.microsoft.com/en-us/library/bb345303.aspx

using (AdventureWorksEntities context =
    new AdventureWorksEntities())
{
    // Call the constructor with a query for products and the ObjectContext.
    ObjectQuery<Product> productQuery1 =
        new ObjectQuery<Product>("Products", context);

    foreach (Product result in productQuery1)
        Console.WriteLine("Product Name: {0}", result.Name);

    string queryString =
        @"SELECT VALUE product FROM AdventureWorksEntities.Products AS product";

    // Call the constructor with the specified query and the ObjectContext.
    ObjectQuery<Product> productQuery2 =
        new ObjectQuery<Product>(queryString, context);

    foreach (Product result in productQuery2)
        Console.WriteLine("Product Name: {0}", result.Name);

    // Call the constructor with the specified query, the ObjectContext,  // and the NoTracking merge option.
    ObjectQuery<Product> productQuery3 =
        new ObjectQuery<Product>(queryString,
            context, MergeOption.NoTracking);

    foreach (Product result in productQuery3)
        Console.WriteLine("Product Name: {0}", result.Name);
}

你可以看看这个部分

string queryString =
    @"SELECT VALUE product FROM AdventureWorksEntities.Products AS product";

// Call the constructor with the specified query and the ObjectContext.
ObjectQuery<Product> productQuery2 =
    new ObjectQuery<Product>(queryString, context);

foreach (Product result in productQuery2)
    Console.WriteLine("Product Name: {0}", result.Name);

如果它对你有用,别忘了把它标记为已回答。

【讨论】:

    【解决方案2】:

    您缺少匿名类型的成员名称。包含在我的答案中:

    var Data = initialData.Select(x => new 
                               { 
                                   ID = x.ID, 
                                   Value = (x.Col1 == null)? x.Col1 : x.Col2
                               });
    

    编辑:没关系,误读了这个问题。

    【讨论】:

    • 动态部分在哪里?你基本上只是重写了声明。
    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2023-02-17
    • 1970-01-01
    相关资源
    最近更新 更多