使用Linq to SQL选择具有特定条件的列

时间:2015-08-05 21:37:46

标签: c# linq select

我有一个像Linq一样的选择查询:

        string _mycondition = "0";

          DataClasses1DataContext m = new DataClasses1DataContext();
           var q = from p in m.ViewPersonCarRelations.AsEnumerable()                    
                select new
                {
                    FirstName = p.name,
                    LastName = p.Lname  
                };

我想用条件选择我的列,例如: 只有当_mycondition ==“0”为真时,选择p.name并将其命名为FirstName否则我的变量不应该具有FirstName。 我很奇怪,是否可以用Linq做到这一点?

2 个答案:

答案 0 :(得分:2)

不,这是不可能的。实现这一目标的最简单方法是使用这样的三元运算符:

var q = from p in m.ViewPersonCarRelations.AsEnumerable()                    
                select (_mycondition == "0") ?
                    new 
                    {
                        FirstName = p.name,
                        LastName = p.Lname  
                    }
                    :
                    new 
                    {
                        LastName = p.Lname
                    };

此代码可能会导致以下编译器错误:

  

由于存在,因此无法确定条件表达式的类型   “AnonymousType#1”和“AnonymousType#2”

之间没有隐式转换

由于无法为匿名类型重载运算符,因此您必须找到另一种实现目标的方法。您可以创建两个类,重载隐式运算符,而不是使用匿名类型。

修改

实际上有一种方法可以做到这一点,但我强烈反对它 - 你会得到一个Enumerable<object>作为结果。由于object是.NET框架中所有类型的基本类型,因此您可以将第二个匿名类转换为object(您也可以转换第一个,但这将是多余的)。 / p>

select (_mycondition == "0") ?
    new 
    {
        FirstName = p.name,
        LastName = p.Lname 
    }
    :
    (object)new 
    {
        LastName = p.Lname
    };

答案 1 :(得分:1)

如果我理解您所说的内容,您希望在运行时决定您创建的匿名类型q是否具有FirstName属性。< / p>

在静态类型系统中,这是不可能的。原因是,即使您没有指定q的类型,它也拥有类型:它只是&#34;匿名&#34;对我们来说,编码员。编译器必须知道它是什么。它不会在运行时间之前保持不确定状态。

但是有一个例外。我相信你可以使用ExpandoObject作为System.Dynamic命名空间的一部分。这将允许您在运行时创建新属性。

但只是在你的类型上定义FirstName并且有时候会有一个空值会更简单。

 string _mycondition = "0";

 DataClasses1DataContext m = new DataClasses1DataContext();
 var q = from p in m.ViewPersonCarRelations.AsEnumerable()                    
     select new
     {
          FirstName = (_mycondition=="0") ? p.name : null,
          LastName = p.Lname  
     };