LINQ to SQL在结果中省略了字段,同时仍将其包含在where子句中

时间:2011-09-12 09:33:14

标签: c# sql linq linq-to-sql

基本上我正在尝试在LINQ to SQL中执行此操作;

SELECT DISTINCT a,b,c FROM table WHERE z=35

我试过这个,(c#代码)

(from record in db.table
select new table {
    a = record.a,
    b = record.b,
    c = record.c
}).Where(record => record.z.Equals(35)).Distinct();

但是当我以这种方式从表对象中删除列z时,我得到以下异常;

  

绑定错误:在投影中找不到成员'table.z'。

我无法返回字段z因为它会使我的明显无用。感谢任何帮助。谢谢。

修改:

这是一个更全面的例子,包括使用PredicateBuilder,

var clause = PredicateBuilder.False<User>();
clause = clause.Or(user => user.z.Equals(35));
foreach (int i in IntegerList) {
    int tmp = i;
    clause = clause.Or(user => user.a.Equals(tmp));
}

var results = (from u in db.Users
               select new User {
                   a = user.a,
                   b = user.b,
                   c = user.c
               }).Where(clause).Distinct();

编辑2:

非常感谢大家的评论和答案,这是我最终的解决方案,

var clause = PredicateBuilder.False<User>();
clause = clause.Or(user => user.z.Equals(35));
foreach (int i in IntegerList) {
    int tmp = i;
    clause = clause.Or(user => user.a.Equals(tmp));
}

var results = (from u in db.Users
               select u)
               .Where(clause)
               .Select(u => new User {
                   a = user.a,
                   b = user.b,
                   c = user.c
               }).Distinct();

选择后面的Where的顺序是至关重要的。

3 个答案:

答案 0 :(得分:5)

问题是因为你的where子句在linq查询之外,并且你在新的匿名数据类型上应用了where子句,因为它导致了错误

建议您更改查询,如

(from record in db.table
where record.z == 35
select new table {
    a = record.a,
    b = record.b,
    c = record.c
}).Distinct();

答案 1 :(得分:2)

你不能把WHERE子句放在LINQ中吗?

(from record in db.table
where record.z == 35
select new table {
    a = record.a,
    b = record.b,
    c = record.c
}).Distinct();

或者,如果您必须按照编写它的方式使用它,请使用.Select

。选择(r =&gt; new {a = r.a,b = r.b,c = r.c})。Distinct();

如此处LINQ Select Distinct with Anonymous Types所示,此方法将起作用,因为它会比较匿名类型的所有公共属性。

希望这会有所帮助,遗憾的是我对LINQ的经验不多,所以我的答案在专业知识方面有限。

答案 2 :(得分:0)

  

SELECT DISTINCT a,b,c FROM table WHERE z=35

关于SQL的一个重要注意事项是WHERE …子句出现在SELECT …子句之后,逻辑上必须在之前执行 {{1} }:就是说,首先你过滤输出不需要的记录(通过在SELECT子句中指定条件),然后你项目WHERE )通过从中选择特定属性来记录剩余的记录。

(以类似的方式,SELECT实际上不能在最后结束时执行,此时所有结果记录都可用;但它位于查询的开头。)


现在让我们看看你的LINQ查询(我已经缩写并重新格式化了一点):

DISTINCT

从上面的解释中,您现在可以很容易地看到您将SQL查询过于字面翻译为C#,从而导致(from … in … select …).Where(…).Distinct(); Select的排序错误。尝试扭转它,事情可能会更好:

Where

这(比相应的SQL查询更多)准确地反映了实际执行单个运算符(from record in db.table where record.z == 35 select new table { a = record.a, b = record.b, c = record.c }) .Distinct(); WhereSelect的顺序。

P.S。:我的回答的最后一点假设Distinct不是您的db.table类型的集合。根据您的要求,table似乎没有table属性,而z集合的基础类型确实如此。