我刚刚问了这个问题。这让我想到了一个新问题:)
到目前为止,我已经使用了以下模式来选择Linq到SQL的内容,目的是能够处理查询返回的0个"行":
var person = (from p in [DataContextObject].Persons
where p.PersonsID == 1
select new p).FirstOrDefault();
if (person == null)
{
// handle 0 "rows" returned.
}
但我不能在使用FirstOrDefault()
时使用:
var person = from p in [DataContextObject].Persons
where p.PersonsID == 1
select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode };
// Under the hood, this pattern generates a query which selects specific
// columns which will be faster than selecting all columns as the above
// snippet of code does. This results in a performance-boost on large tables.
如何使用第二种模式检查查询返回的0"行"?
更新:
我认为我的构建失败了,因为我试图将查询结果分配给用[DataContext].User
类型声明的变量(this._user
)。
this._user = (from u in [DataContextObject].Users
where u.UsersID == [Int32]
select new { u.UsersID }).FirstOrDefault();
编译错误:无法将类型"AnonymousType#1"隐式转换为"[DataContext].User"。
有什么想法吗?我必须自己制作物品吗?
为什么你能一直做同样的事情?这是不是给你一个错误?
var person = (from p in [DataContextObject].Persons
where p.PersonsID == 1
select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode }).FirstOrDefault();
if (person == null) {
// handle 0 "rows" returned.
}
它仍然是一个引用对象,就像你的实际对象一样,它只是匿名的,所以在编译代码之前你不知道实际的类型。
更新:
我现在明白你在问什么了!对不起,我的答案不再适用。我以为你没有得到空值。接受的响应是正确的,如果你想在范围外使用对象,你需要创建一个新的类型,只需使用NewMyType(…)。我知道DevEx的RefactorPro对此进行了重构,我认为resharper也可以。
调用.FirstOrDefault(null)如下:
string[] names = { "jim", "jane", "joe", "john", "jeremy", "jebus" };
var person = (
from p in names where p.StartsWith("notpresent") select
new { Name=p, FirstLetter=p.Substring(0,1) }
)
.DefaultIfEmpty(null)
.FirstOrDefault();
MessageBox.Show(person==null?"person was null":person.Name + "/" + person.FirstLetter);
这对我来说很有用。
关于您的UPDATE:您必须创建自己的类型,或者更改它_用户为int,或者选择整个对象,而不仅仅是特定列。
if (person.Any()) /* ... */;
或
if (person.Count() == 0) /* ... */;
您仍然可以使用FirstOrDefault
。只有
var PersonFields = (...).FirstOrDefault()
PersonFields将为null或具有您创建的那些属性的对象。