使用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。
不,不可能。最简单的方法是使用三元操作符,如下所示:
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
};