c# - 构建仅包含字段名称的 linq 表达式

标签 c# asp.net linq entity-framework lambda

我有如下三个类

public class User : BaseEntity
{  
    public string Name { get; set; }

    public string Surname { get; set; }
}

public class Product
{

    public string Name { get; set; }

    [ForeignKey("AddUser")]
    public int? AddUserId { get; set; }

    public virtual User AddUser { get; set; }

}

public class Jobs
{

    public string Name { get; set; }

    [ForeignKey("AddUser")]
    public int? AddUserId { get; set; }

    public virtual User AddUser { get; set; }

}

我想构建查询来选择一些实体。

但我将通过从 db 中读取一些值来构建查询。 例如我有以下字符串

1-   "Product",
     "Name = "abc"

2-   "Jobs",
     "Name" = "abc"

3-    "Product",
      "AddUser.Name" = "abc"

4-    "Jobs",
      "AddUser.Name" = "abc" || "Name" = "abc"

现在我需要一个函数来构建正确的查询。

我的应用程序语言是 c#,我使用的是 asp.net。 我需要查询 Entity Framework 。 我该怎么办。

最佳答案

有一些方法可以做到:

1) 对每个可能的表名和列名进行硬编码,如下所示:

if (tableName == "Jobs") query = query.Where(...)

如果您真的确定数据模型将来不会发生变化,并且表和列的数量很少,那么这是一个很好的解决方案。否则,这是一个非常糟糕的解决方案。

2) 使用http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library 使用此库,您可以从字符串创建表达式树。不要忘记安全问题,因为让用户有权创建自己的 SQL 查询并不是一个好主意。

3) 构建您自己的表达式树。这是一篇很好的文章:http://msdn.microsoft.com/en-us/library/bb882637.aspx 这是一个最复杂的解决方案,它允许您控制您想要的一切。如果您想提供的操作数量有限,这是一个很好的解决方案。

4) 使用 StringBuilder 类从字符串构建 SQL,然后执行 SQL。这是一篇文章:http://msdn.microsoft.com/en-us/data/jj592907.aspx 当然,由于安全问题,您应该非常小心地构建此 SQL。如果您计划使用查询并修改它们(即添加额外的过滤器、连接、跳过/获取等),那么这是一个坏主意。

关于c# - 构建仅包含字段名称的 linq 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27754744/

相关文章:

asp.net - 如何下载用于个人/学习目的的 sitecore CMS?

Linq .Contains with large set 导致 TDS 错误

c# - 使用 PFX 证书发送 HttpWebRequest C#

c# - 如何在特定时间在 Windows Phone 8 上执行一个方法?

c# - 抛出类型为 'system.outofmemoryexception' 的异常

asp.net - 当用户使用 CAS SSO 注销时,ASP.NET MVC 触发 HttpRequestValidationException

c# - 在 C# 中更快地调用 PowerShell cmdlet

c# - 使用 C# 向 GMail 发送 IMAP 命令

c# - Asp.Net 连接表,以便它们可以正确排序 C# LINQ

c# - 如何使用 lambda 将列表对象添加到类中?