Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq to SQL选择具有特定条件的列_C#_Linq_Select - Fatal编程技术网

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

C# 使用Linq to SQL选择具有特定条件的列,c#,linq,select,C#,Linq,Select,我有一个使用Linq的select查询,如下所示: string _mycondition = "0"; DataClasses1DataContext m = new DataClasses1DataContext(); var q = from p in m.ViewPersonCarRelations.AsEnumerable() select new

我有一个使用Linq的select查询,如下所示:

        string _mycondition = "0";

          DataClasses1DataContext m = new DataClasses1DataContext();
           var q = from p in m.ViewPersonCarRelations.AsEnumerable()                    
                select new
                {
                    FirstName = p.name,
                    LastName = p.Lname  
                };
var q = from p in m.ViewPersonCarRelations.AsEnumerable()                    
                select (_mycondition == "0") ?
                    new 
                    {
                        FirstName = p.name,
                        LastName = p.Lname  
                    }
                    :
                    new 
                    {
                        LastName = p.Lname
                    };
我想选择带有条件的列,例如: 仅当_mycondition==“0”为真时,选择p.name并将其命名为FirstName,否则我的变量不应具有FirstName。
我想知道,是否可以用Linq实现这一点?

如果我理解您的意思,您希望在运行时决定您正在创建的匿名类型
q
是否具有
FirstName
属性

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

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

如果我理解您的意思,您需要在运行时决定您正在创建的匿名类型
q
是否具有
FirstName
属性

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

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

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

        string _mycondition = "0";

          DataClasses1DataContext m = new DataClasses1DataContext();
           var q = from p in m.ViewPersonCarRelations.AsEnumerable()                    
                select new
                {
                    FirstName = p.name,
                    LastName = p.Lname  
                };
var q = from p in m.ViewPersonCarRelations.AsEnumerable()                    
                select (_mycondition == "0") ?
                    new 
                    {
                        FirstName = p.name,
                        LastName = p.Lname  
                    }
                    :
                    new 
                    {
                        LastName = p.Lname
                    };
此代码可能会导致以下编译器错误:

无法确定条件表达式的类型,因为存在 “匿名类型#1”和“匿名类型#2”之间没有隐式转换

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

编辑

实际上有一种方法可以做到这一点,但我强烈建议不要这样做-结果将是一个
可枚举的
。由于
对象
是.NET framework中所有类型的基本类型,因此可以将第二个匿名类强制转换为
对象
(也可以强制转换第一个匿名类,但这是多余的)


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

        string _mycondition = "0";

          DataClasses1DataContext m = new DataClasses1DataContext();
           var q = from p in m.ViewPersonCarRelations.AsEnumerable()                    
                select new
                {
                    FirstName = p.name,
                    LastName = p.Lname  
                };
var q = from p in m.ViewPersonCarRelations.AsEnumerable()                    
                select (_mycondition == "0") ?
                    new 
                    {
                        FirstName = p.name,
                        LastName = p.Lname  
                    }
                    :
                    new 
                    {
                        LastName = p.Lname
                    };
此代码可能会导致以下编译器错误:

无法确定条件表达式的类型,因为存在 “匿名类型#1”和“匿名类型#2”之间没有隐式转换

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

编辑

实际上有一种方法可以做到这一点,但我强烈建议不要这样做-结果将是一个
可枚举的
。由于
对象
是.NET framework中所有类型的基本类型,因此可以将第二个匿名类强制转换为
对象
(也可以强制转换第一个匿名类,但这是多余的)


你的意思是你想选择所有没有名字的地方吗empty@OmarQaddoumi不我想在运行时决定是否选择FirstName!你的意思是你想选择所有没有名字的地方吗empty@OmarQaddoumi不我想在运行时决定是否选择FirstName!正如您所说,我想在运行时决定我的变量是否包含FirstName,因为我想将查询导出到excel,而我的列不应该存在@mosyflasher:也许您需要一个不同于一个属性=一列的类的数据结构。考虑使用旧式的<代码> DATABATE < /代码>。您可以在运行时使用您想要的任何条件定义新列。正如您所说,我想在运行时确定我的变量是否包含FirstName,因为我想将查询导出到excel,而我的列不应该存在@mosyflasher:也许您需要一个不同于一个属性=一列的类的数据结构。考虑使用旧式的<代码> DATABATE < /代码>。您可以在运行时使用所需的任何条件定义新列。