表达式语法单个字段

时间:2012-11-09 20:00:15

标签: c# linq lambda

我一直致力于一个使用第三方DAL(SubSonic)为所有数据库对象生成类的项目。

对于查询这些对象,现有的代码实践通常是:

int keyValue = 1;
TableObject t = TableObject.SingleOrDefault(x => (x.keyField == keyValue));
if (t != null) {
    int valueWeWant = t.fieldWeWant;
    string otherValueWeWant = t.otherFieldWeWant;
}

我一直在尝试尽可能地减少SQL流量,因为我们往往有大行并且通常只关注一个或两个字段。到目前为止,我能找到的最佳方法是:

int keyValue = 1;
var t = TableObject.All().Where(x => (x.keyField == keyValue)).Select(x => new { x.fieldWeWant, x.otherFieldWeWant}).Take(1);
if ((t != null) && (t.Count() != 0)) {
    int valueWeWant = t.First().fieldWeWant;
    string otherValueWeWant = t.First().otherFieldWeWant;
}

我喜欢生成的SQL只选择一行和两个字段,并且对匿名类型的可读性感到满意,但是必须比较.Count()似乎对我来说很浪费。

我错过了一种更简单的方法来执行此操作吗?

2 个答案:

答案 0 :(得分:3)

如果您将Take(1)替换为SingleOrDefault(),则需要仅检查null,而不是Count() == 1,并跳过First()的来电:

var t = TableObject
    .All()
    .Where(x => (x.keyField == keyValue))
    .Select(x => new { x.fieldWeWant, x.otherFieldWeWant})
    .SingleOrDefault();
if (t != null) {
    int valueWeWant = t.fieldWeWant;
    string otherValueWeWant = t.otherFieldWeWant;
}

答案 1 :(得分:0)

你有正确的想法,但如果你发现yourslef使用Count()> 0,你会想要使用

if ((t != null) && (t.Any())) 

.Any()在找到集合中的第一个实体后返回true。然而,.Count()在返回true之前迭代整个集合并且是性能命中