我有一个像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做到这一点?
答案 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
};