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

Red*_*Taz 0 c# sql linq linq-to-sql

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

SELECT DISTINCT a,b,c FROM table WHERE z=35
Run Code Online (Sandbox Code Playgroud)

我试过这个,(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();
Run Code Online (Sandbox Code Playgroud)

但是当我以这种方式从表对象中删除列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();
Run Code Online (Sandbox Code Playgroud)

EDIT2:

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

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();
Run Code Online (Sandbox Code Playgroud)

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

Pra*_*ana 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();
Run Code Online (Sandbox Code Playgroud)