使用 LINQ 从选择中排除列

Posted

技术标签:

【中文标题】使用 LINQ 从选择中排除列【英文标题】:Exclude a column from a select using LINQ 【发布时间】:2013-10-19 06:23:33 【问题描述】:

我正在使用实体框架代码优先开发 WCF RESTful Web 服务。

我有一张表Users 有很多列。我这样做是为了获取特定用户:

context.Configuration.ProxyCreationEnabled = false;
var users = from u in context.Users
            where u.UserId == userId
            select u;

在这个表上,有一个密码列,我不想返回这个列。

如何从该选择中排除密码列?

【问题讨论】:

LINQ to SQL - How to select specific columns and return strongly typed list 的可能重复项 顺便说一句,恕我直言,这是一个糟糕的设计。你永远不应该将你的实体暴露给你的 UI、Web 服务等。你应该有一个 DTO(数据传输对象),它基本上是一个 POCO,只有你想要公开的那些字段。 【参考方案1】:

说起来很难过,但是

您无法选择直接排除任何特定列。您可以使用延迟加载列。

最简单且不受欢迎的方法是包含您想要的列。

【讨论】:

【参考方案2】:

这样的另一种方式,

   var users = from u in context.Users
                where u.UserId == userId
                select new 
                
                    col1 = u.UserId, 
                    col2 = u.Watever
                .ToList();

【讨论】:

【参考方案3】:

在你的选择语句中指定你想要的每一列:

var users = from u in context.Users

        where u.UserId == userId

        select u.UserId, u.Watever, etc... ;

【讨论】:

这个语法给了我一个编译时错误“; expected”。您的意思是对匿名类型使用 new u.UserId, u.Whatever, ... 语法吗? 不,您只是忘记了末尾的分号或打错了字。当然,您不会键入“等”。在我的示例中显示。在列出的最后一列之后,去掉逗号并以分号结束... select u.UserId, u.AnotherColumn, u.LastColumn; 编译器拒绝您输入的方式。 Here 是如何选择多列。我正在更新你的答案。【参考方案4】:

您可以为每个表创建多个 LINQ 对象。我会创建一个包含您需要的字段和一个没有的字段。但它使 CRUD 操作更加困难。

【讨论】:

以上是关于使用 LINQ 从选择中排除列的主要内容,如果未能解决你的问题,请参考以下文章

用于从实体类及其导航属性中选择多个列的 Linq Lambda 表达式

是否可以在选择完成之前设置列别名,使用 Linq to SQL

Linq MVC5 MSQL 从包含大量列的表中选择一些列,以便更好更快地查询

BigQuery - 选择多个列并希望排除两个双嵌套列

使用linq c#从数据表中选择整个重复行

Linq:在数据表列中选择值