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

本文关键字:特定条件 选择 Linq to SQL 使用 | 更新日期: 2023-09-27 18:06:30

我有一个选择查询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 to SQL选择具有特定条件的列

不,不可能。最简单的方法是使用三元操作符,如下所示:

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(您也可以强制转换第一个匿名类,但那将是多余的)。

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

如果我明白你在说什么,你想在运行时决定你正在创建的匿名类型q是否具有FirstName属性。

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

有一个例外。我相信您可以使用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  
     };