基本上我正在尝试在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的顺序是至关重要的。
答案 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();
,Where
和Select
的顺序。
P.S。:我的回答的最后一点假设Distinct
不是您的db.table
类型的集合。根据您的要求,table
似乎没有table
属性,而z
集合的基础类型确实如此。